uva 193 Graph Coloring
来源:互联网 发布:万方数据库免费入口 编辑:程序博客网 时间:2024/05/17 03:30
原题:
You are to write a program that tries to find an optimal coloring for a given graph. Colors are applied to the nodes of the graph and the only available colors are black and white.
The coloring of the graph is called optimal if a maximum of nodes is black. The coloring is restricted by the rule that no two connected nodes may be black.
Input
The graph is given as a set of nodes denoted by numbers 1 … n, n ≤ 100, and a set of undirected edges denoted by pairs of node numbers (n1, n2), n1 ̸= n2. The input file contains m graphs. The number m is given on the first line. The first line of each graph contains n and k, the number of nodes and the number of edges, respectively. The following k lines contain the edges given by a pair of node numbers, which are separated by a space.
Output
The output should consists of 2m lines, two lines for each graph found in the input file. The first line of should contain the maximum number of nodes that can be colored black in the graph. The second line should contain one possible optimal coloring. It is given by the list of black nodes, separated by a blank.
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 <bits/stdc++.h>using namespace std;vector<int> G[111];int n,k,solve[111],tmp[111],color[111],ans;void ini(){ memset(tmp,0,sizeof(tmp)); for(int i=1;i<=n;i++) G[i].clear(); ans=0;}void dfs(int x,int tmp[]){ int color[101]; if(x==n) { int cnt=0; for(int i=1;i<=n;i++) if(tmp[i]==1) cnt++; if(cnt>ans) { memcpy(solve,tmp,sizeof(solve)); ans=cnt; } } else { for(int i=1;i<=n;i++) { if(tmp[i]==0) { memcpy(color,tmp,sizeof(color)); color[i]=1; int cnt=1; for(int j=0;j<G[i].size();j++) { if(color[G[i][j]]==0) { color[G[i][j]]=-1; cnt++; } } dfs(x+cnt,color); } } }}int main(){ ios::sync_with_stdio(false); int t; cin>>t; while(t--) { cin>>n>>k; ini(); for(int i=1;i<=k;i++) { int a,b; cin>>a>>b; G[a].push_back(b); G[b].push_back(a); } dfs(0,tmp); cout<<ans<<endl; /* for(int i=1;i<=n;i++) { if(solve[i]==1&&ans>0) { if(ans==1) cout<<i<<endl; else cout<<i<<" "; ans--; } }*/ k=0; for(int i=1;i<=n;i++) if(solve[i]==1) { if(k++) cout<<" "; cout<<i; } cout<<endl; } return 0;}
解答:
思路很简单,染成黑色的节点周围和它相邻的节点肯定都是白色点。暴力解决即可,但是怎么写都是wa,后来看别人代码知道了图可能是不连通的。
有一个优化的想法,如果计算黑色点最大,可能不太好像优化的方法。但是反过来可以去想计算白色的点最少,记录上一次白色点最少的结果,下一次枚举图中的白色点的个数的时候,如果枚举到半路就已经比上次得到的结果多了,那就可以剪枝了。
- uva 193 - Graph Coloring
- UVa 193 - Graph Coloring
- uva 193 - Graph Coloring
- UVa 193 - Graph Coloring
- uva 193 - Graph Coloring
- UVa 193 - Graph Coloring
- UVA 193 Graph Coloring
- uva 193 Graph Coloring
- uva 193 Graph Coloring
- UVa:193 Graph Coloring
- UVa 193 - Graph Coloring
- UVA 193 - Graph Coloring
- UVA - 193 Graph Coloring
- UVA - 193 Graph Coloring
- uva 193 Graph Coloring
- UVA 193 Graph Coloring
- uva 193 Graph Coloring
- UVA 193 Graph Coloring
- Java之Timer使用
- Twitter的分布式自增ID算法snowflake - C#版
- 10 Java并发编程2-Thread类总结
- android四种基本布局之FrameLayoutAndTableLayout
- 性能测试的测试用例
- uva 193 Graph Coloring
- hdu3567 Eight II 康拓展开+打表+路径回溯+映射
- php时间戳的转换
- ubuntu16.04+qt 一些问题
- shell脚本实现删除过期数据库中的数据
- 400. Nth Digit
- DTW(动态时间规整算法)
- Seating On Bus
- ROS入门_1.14 编写及测试简单的消息发布器和订阅器 (C++)