最大团(dfs)
来源:互联网 发布:linux打包war文件 编辑:程序博客网 时间:2024/05/29 03:12
问题描述:团就是最大完全子图。
给定无向图G=(V,E)。如果UV,且对任意u,vU 有(u,v) E,则称U 是G 的完全子图。(U中任意两点间相连)
G 的完全子图U是G的团当且仅当U不包含在G 的更大的完全子图中,即U就是最大完全子图。
G 的最大团是指G中所含顶点数最多的团。
例如:
(a) (b) (c) (d)
图a是一个无向图,图b、c、d都是图a的团,且都是最大团。
tips:子集树搜索,只有当前点与团中所有的点都相连时,将该点加入团中。如果不将当前点加入团中,须满足剩下的所有的点加上当前团中的点比已知解更优。
#include<iostream>#include<cstring>#include<vector>using namespace std;vector<int>v;int map[15][15];int tmp[15];//1代表当前下标节点在团中 int n,m;//定点从一开始编号 int ans;void dfs(int step,int cnt){if(step>n){ans=cnt;v.clear();for(int i=1;i<=n;i++){if(tmp[i])v.push_back(i);}return;}int flag=1;for(int i=1;i<step;i++){if(tmp[i]==1&&map[step][i]==0){flag=0;break;}}if(flag){tmp[step]=1;dfs(step+1,cnt+1); tmp[step]=0;//别忘记回溯 } if(cnt+(n-step)>ans){ tmp[step]=0; dfs(step+1,cnt); }}int main(){while(cin>>n>>m){v.clear();ans=0;memset(map,0,sizeof(map));memset(tmp,0,sizeof(tmp));for(int i=1;i<=m;i++){int x,y;cin>>x>>y;map[x][y]=map[y][x]=1;}dfs(1,0);for(int i=0;i<v.size();i++)cout<<v[i]<<" ";cout<<endl; } return 0; } /*5 71 21 41 52 54 52 35 3*/
0 0
- 最大团(dfs)
- Maximum Clique-最大团dfs
- hdu 5952 Counting Cliques(最大团思想+dfs)
- 组队(最大团)
- poj(3962)最大团
- POJ3692:Kindergarten(最大团)
- 最大团算法(codeforces839E)
- 最大团
- 最大团
- 最大团
- 最大团
- 最大团
- 最大团
- poj 3692 (二分图最大团)
- 1530 Maximum Clique 最大团(模板)
- POJ 3692:Kindergarten(最大团)
- hdu3585 二分最大团(dp优化)
- poj 3692 -- Kindergarten(最大团,匈牙利)
- MP3标题重命名以及文本去掉模板尾巴
- poj1195~Mobile phones(二维树状数组)
- LintCode 二叉树的层次遍历
- svg-icon网站
- 将二叉树拆成链表
- 最大团(dfs)
- 杭电OJ 1007 Quoit Design
- DALSA相机开发记录(01)
- new与malloc的前世今生
- 【学无止境】ajax长循环,反向ajax初体会,不用ws实现即时聊天
- oracle中只有物理备份没有逻辑备份,表被truncate,如何恢复
- 微信公众号授权第三方平台
- POJ-2400-Supervisor, Supervisee(KM+DFS)
- 序列化与反序列化