您的位置:首页 > 编程语言

NP问题,最小顶点覆盖;主要是编程技巧;用了set,效率高,空间小,图用邻接表存储;

2010-06-28 13:02 363 查看
#include <iostream>
#include <set>
#include <vector>
using namespace std;

/*
Graph input
*/

const int SIZE = 1000;

int u[SIZE],v[SIZE],m;
set<int> vis;
vector<int> cover;

typedef struct node
{
node()
{
v=-1;
next=0;
}
int v;
struct node *next;
}Node;

typedef struct graph
{
Node head[SIZE];
}Graph;

Graph g;

void approxVertexCover()
{
for(int i=0;i<m;++i)
{
if(vis.count(u[i]*10+v[i]))
{
for(Node *p=g.head[u[i]].next;p!=0;p=p->next)
{
vis.erase(u[i]*10+p->v);
}

for(Node *q=g.head[v[i]].next;q!=0;q=q->next)
{
vis.erase(v[i]*10+q->v);
}
cout<<u[i]<<" "<<v[i]<<" ";
//  cover.push_back(i);
}
}
}

int main()
{
vis.clear();
cin>>m;
for(int i=0;i<m;++i)
{
cin>>u[i]>>v[i];
Node *a=new Node;
a->v=v[i];
a->next=g.head[u[i]].next;
g.head[u[i]].next=a;
Node *b=new Node;
b->v=u[i];
b->next=g.head[v[i]].next;
g.head[v[i]].next=b;
vis.insert(u[i]*10+v[i]);
vis.insert(v[i]*10+u[i]);
}
approxVertexCover();

cout<<endl;
return 0;
}


 

 

先读入一系列的边,建立无向图邻接表,同时用set标记边是否已经被排除,初始化所有边均为排除.

 

算法依次考虑每一条尚未被排除的边,排除这些边的两个端点相邻的边.

 

获得的近似最小覆盖的规模<=2倍最优覆盖规模,属于近似算法.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息