pku Graph Coloring
来源:互联网 发布:手机网页翻译软件 编辑:程序博客网 时间:2024/04/30 01:13
Graph Coloring
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 3352 Accepted: 1497 Special Judge
Description
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.
Figure 1: An optimal graph with three black nodes
Figure 1: An optimal graph with three black nodes
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
16 81 21 32 42 53 43 64 65 6
Sample Output
31 4 5
代码:
#include <cstdio>#include <string>#include<string.h>#define NMAX 110bool path[NMAX][NMAX];int n, mmax;int dp[NMAX];bool v[NMAX];int seq[NMAX], seq_pos;//seq记录最大团集合bool dfs(int pos, int size){ int i, j, unvis; bool tv[NMAX]; unvis = 0; for (i=pos; i<n; i++) { if (!v[i]) { unvis ++; } } if (unvis == 0) //|U| = 0 { if (size > mmax) { mmax = size; seq_pos = 0; seq[ seq_pos ++] = pos+1; return true; } return false; } for (i=pos; i < n && unvis > 0 ; i++) { if (!v[i]) { if (unvis + size <= mmax || dp[i] + size <= mmax) { return false; } v[i] = true;//U = U\{vi} unvis --; memcpy(tv, v, sizeof(v)); for (j=0; j<n; j++) //U ∩N(vi); { if (!path[i][j]) { v[j] = true; } } if ( dfs(i, size+1) ) { seq[ seq_pos ++] = pos+1; return true; } memcpy(v, tv, sizeof(v)); } }//while U is not empty return false;}int max_clique(){ int i,j; mmax = 0; for (i=0; i<n; i++) { path[i][i] = false; } for (i=n-1; i>=0; i--) { for (j=0; j<n; j++) //Si ∩N(vi); { v[j] = !path[i][j]; } dfs(i, 1); dp[i] = mmax; } return mmax;}int main(){ int i,j,x,y,e; int m,tn; scanf("%d", &m); while (m --) { scanf("%d %d", &n, &e); memset(path,0,sizeof(path)); for (i=0; i<e; i++) { scanf("%d %d", &x,&y); x--; y--; path[x][y] = path[y][x] = true; }//max independent set in original graph//max clique in inverse graph for (i=0; i<n; i++) { for (j=0; j<n; j++) { path[i][j] = !path[i][j]; } } memset(dp,0,sizeof(dp)); printf("%d\n", max_clique()); printf("%d", seq[0]); for (i=1; i<seq_pos; i++) { printf(" %d", seq[i]); } printf("\n"); }}
- pku Graph Coloring
- Graph Coloring
- poj 1419 Graph Coloring
- uva 193 - Graph Coloring
- UVa 193 - Graph Coloring
- uva 193 - Graph Coloring
- UVa 193 - Graph Coloring
- poj1419 - Graph Coloring
- POJ 1419 Graph Coloring
- Graph coloring(P1419)
- 193 - Graph Coloring
- uva193 - Graph Coloring
- uva 193 - Graph Coloring
- UVa 193 - Graph Coloring
- UVA 193 Graph Coloring
- POJ-1419-Graph Coloring
- uva 193 Graph Coloring
- uva 193 Graph Coloring
- ZJUT 1208 排列对称串
- (译)加入敌人和战斗:如果使用cocos2d制作基于tiled地图的游戏:第三部分
- 分层遍历二叉树
- Jfreechart柱形图详细设置(转)
- form表单字段元素对象实例(二)— —用户名和密码争夺焦点,造成死锁事件
- pku Graph Coloring
- 很有用的Html 显示特殊符号
- NSAssert
- Android软件安全开发实践(上)
- 优化C++游戏:对象的创建和销毁
- (译)如何使用cocos2d开发一个简单的iphone游戏:旋转炮塔。(第二部分)
- UIImageView响应点击事件
- 如何查看mysql支持的存储引擎
- Android软件安全开发实践(下)