【POJ 1419】Graph Coloring
2015-07-28 10:41
232 查看
【POJ 1419】Graph Coloring
求图的最大独立集 最大独立集=补图最大团
很适合理解最大团/最大独立集的模板题
建立补图套模板既可 需要输出集合点 原本想用stack 但发现copy比较麻烦 vector用一个iterator指针 循环很便利
代码如下:
求图的最大独立集 最大独立集=补图最大团
很适合理解最大团/最大独立集的模板题
建立补图套模板既可 需要输出集合点 原本想用stack 但发现copy比较麻烦 vector用一个iterator指针 循环很便利
代码如下:
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <vector> using namespace std; bool mp[111][111]; int link[111][111],dp[111],mx; vector <int> s,ss; void dfs(int n,int num,int step) { int i,j,k,cnt; if(num == 0) { if(mx < step) { s.clear(); vector<int>::iterator it = ss.begin(); for(;it != ss.end(); ++it) s.push_back(*it); mx = step; } return; } for(i = 0; i < num; ++i) { cnt = 0; k = link[step][i]; if(step + n - k <= mx) return; if(step + dp[k] <= mx) return; for(j = i+1; j < num; ++j) if(mp[link[step][j]][k]) link[step+1][cnt++] = link[step][j]; ss.push_back(k); dfs(n,cnt,step+1); ss.pop_back(); } } int GetMax(int n) { int i,j,sz; mx = 0; for(i = n; i >= 1; --i) { sz = 0; for(j = i+1; j <= n; ++j) if(mp[i][j]) link[1][sz++] = j; ss.push_back(i); dfs(n,sz,1); ss.pop_back(); dp[i] = mx; } return mx; } int main() { int t,n,m,u,v,i; scanf("%d",&t); while(t--) { memset(mp,true,sizeof(mp)); scanf("%d %d",&n,&m); while(m--) { scanf("%d %d",&u,&v); mp[u][v] = mp[v][u] = false; } for(i = 1; i <= n; ++i) mp[i][i] = false; printf("%d\n",GetMax(n)); vector <int> ::iterator it = s.begin(); for(; it+1 != s.end(); ++it) printf("%d ",*it); printf("%d\n",*it); } return 0; }
相关文章推荐
- Binary Tree Zigzag Level Traversal
- BNU 28887——A Simple Tree Problem——————【将多子树转化成线段树+区间更新】
- 搭建Git本地服务器
- Android学习笔记之事件分发机制(一)
- HDU 5251 矩形面积(凸包-Graham扫描法)
- Pro Git (官网文档)
- 关于代码质量的问题
- 设计模式之-----抽象工厂模式
- POJ 1065:Wooden Sticks
- mysql取time ,datetime字段显示问题
- SpringMVC详解(一)简介
- css居中总结
- hdu1535 SPFA
- POJ 3648 2-sat
- iOS Sprite Kit教程之场景的切换
- CSS3实现动态背景登录框的代码
- 年轻程序员的悲伤
- TCP and UDP Small Servers
- MbrFix的用法
- 开放还是封闭?一个值得考虑的问题