标签:
Time Limit: 1000MS | Memory Limit: 10000K | |||
Total Submissions: 4926 | Accepted: 2289 | Special Judge |
Description
Input
Output
Sample Input
1 6 8 1 2 1 3 2 4 2 5 3 4 3 6 4 6 5 6
Sample Output
3 1 4 5
【分析】此题就是求最大独立集。二部图的最大独立集==顶点数-匹配数,普通图的最大独立集==补图的最大团,且此题需要输出路径,所以用最大团的模板算法较好。
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <string> #include <map> #include <queue> #include <vector> #define inf 0x7fffffff #define met(a,b) memset(a,b,sizeof a) typedef long long ll; using namespace std; const int N = 105; const int M = 25005; bool w[N][N]; bool use[N]; //进入团的标号 bool bestx[N]; int cn,bestn,p,e; void dfs(int x) { bool flag; if(x>p) { bestn=cn; //cn的值是递增的 for( int i=1;i<=p; i++) //赋值给另外一个数组, bestx[i]=use[i]; return ; } flag=true; for( int i=1; i<x; i++) if(use[i]&&!w[i][x]) { flag=false; break; } if(flag) { cn++; use[x]=true; dfs(x+1); cn--; use[x]=false;//回溯 } if(cn+p-x>bestn) { //剪枝 dfs(x+1); } } int main() { int num,u,v; scanf("%d",&num); while(num--) { memset(w,true,sizeof(w)); memset(use,false,sizeof(use)); memset(bestx,false,sizeof(bestx)); scanf("%d%d",&p,&e); for(int i=0; i<e; i++) { scanf("%d%d",&u,&v); w[u][v]=false; w[v][u]=false; } cn=bestn=0; dfs(1); printf("%d\n",bestn); for (int i=1; i<=p; i++)if(bestx[i])printf("%d ",i);printf("\n"); } return 0; }
POJ1419 Graph Coloring(最大独立集)(最大团)
标签:
原文地址:http://www.cnblogs.com/jianrenfang/p/5955185.html