标签:color ret fir hat \n coloring int sep nes
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
题意:给出你一个无向图,然后对其中的点去上色, 只能上黑色和白色,要求是黑色点不能相邻(白色可以相邻),问最多能上多少黑色的顶点。
题解:就是求图的最大独立集,重点是输出路径,所以套模板,如果不用输出路径,那么可以套公式:最大独立集=顶点数-最大匹配数,匈牙利算法求最大匹配数即可。
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<vector>
5 #include<algorithm>
6 using namespace std;
7 int vis[110];
8 int n,k,m;
9 int ans,res[110];
10 vector<int>v[110];
11 int maxx;
12 void dfs(int pos,int cnt)
13 {
14 if(pos==n+1)
15 {
16 if(cnt>maxx)
17 {
18 int t=0;//一定要注意啊啊!!
19 for(int i=1;i<=n;i++)
20 {
21 if(vis[i])
22 res[t++]=i;
23 }
24 maxx=cnt;
25 }
26 return;
27 }
28 int flag=0;
29 for(int i=0;i<v[pos].size();i++)
30 {
31 if(vis[v[pos][i]])
32 {
33 flag=1;
34 break;
35 }
36 }
37 if(flag==0)
38 {
39 vis[pos]=1;
40 dfs(pos+1,cnt+1);
41 vis[pos]=0;
42 }
43 dfs(pos+1,cnt);
44 return;
45 }
46 void init()
47 {
48 for(int i=0;i<110;i++)
49 v[i].clear();
50 memset(res,0,sizeof(res));
51 memset(vis,0,sizeof(vis));
52 }
53 int main()
54 {
55 int x,y;
56 scanf("%d",&m);
57 while(m--)
58 {
59 init();
60 scanf("%d%d",&n,&k);
61 for(int i=0;i<k;i++)
62 {
63 scanf("%d%d",&x,&y);
64 v[x].push_back(y);
65 v[y].push_back(x);
66 }
67 maxx=-1;
68 dfs(1,0);
69 printf("%d\n",maxx);
70 for(int i=0;i<maxx-1;i++)
71 {
72 printf("%d ",res[i]);
73 }
74 printf("%d\n",res[maxx-1]);
75 }
76
77 return 0;
78 }
标签:color ret fir hat \n coloring int sep nes
原文地址:https://www.cnblogs.com/1013star/p/9795322.html