#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倍最优覆盖规模,属于近似算法.