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倍最优覆盖规模,属于近似算法.
相关文章推荐
- 最小权顶点覆盖问题
- ES doc_values介绍——本质是field value的列存储,做聚合分析用,ES默认开启,会占用存储空间(列存储压缩技巧,除公共除数或者同时减去最小数,字符串压缩的话,直接去重后用数字ID压缩)
- pku3308 【论】如何将二分图顶点覆盖问题转化为最小割
- hdu1054——Strategic Game(最小顶点覆盖+邻接表)
- 关于一个应用分枝界限法解决最小顶点覆盖问题的程序说明
- pku3308 【论】如何将二分图顶点覆盖问题转化为最小割
- UVA 1292 - Strategic game(最小顶点覆盖问题,覆盖所有边,自己版本待解)
- 北大ACM3041——Asteroids~~最小顶点覆盖问题
- 最小权顶点覆盖问题
- 顶点覆盖问题的NP完全证明(Proving NP-completeness of Vertex Cover)
- 最小顶点覆盖(Minimum Vertex Cover)与最大独立集(Maximum Independent Set)
- Asteroids----------求二分图的最小顶点覆盖问题
- POJ 2226 Muddy Fields(最小顶点覆盖)
- 程序员:提高编程效率的技巧
- 顺序表存储空间连续问题
- 4412开发板最小linux系统的存储空间修改
- Asteroids-二分图最小顶点覆盖
- nefu481最小路径覆盖问题【网络流24题】
- poj1325(最小顶点覆盖)
- HDU 1498 50 years, 50 colors (行列匹配+最小顶点覆盖)