UVA 10004判断一个图是否为二分图
2011-04-19 18:35
363 查看
Bicoloring |
Here you are asked to solve a simpler similar problem. You have to decide whether a given arbitrary connected graph can be bicolored. That is, if one can assign colors (from a palette of two) to the nodes in such a way that no two adjacent nodes have the same color. To simplify the problem you can assume:
no node will have an edge to itself.
the graph is nondirected. That is, if a node a is said to be connected to a node b, then you must assume that b is connected to a.
the graph will be strongly connected. That is, there will be at least one path from any node to any other node.
Input
The input consists of several test cases. Each test case starts with a line containing the number n (1 < n < 200) of different nodes. The second line contains the number of edges l. After this, l lines will follow, each containing two numbers that specify an edge between the two nodes that they represent. A node in the graph will be labeled using a number a (
).
An input with n = 0 will mark the end of the input and is not to be processed.
Output
You have to decide whether the input graph can be bicolored or not, and print it as shown below.Sample Input
3 3 0 1 1 2 2 0 9 8 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0
Sample Output
NOT BICOLORABLE. BICOLORABLE.
Miguel Revilla
2000-08-21 此题可以使用BFS和DFS进行判断,不过我用了下2-sat,发现效果也还是不错的。BFS代码:
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; int map[205][205]; int n,m; int col[205]; bool bfs() { int i; queue<int>q; q.push(0); while(!q.empty()) { int temp=q.front(); q.pop(); for(i=0;i<n;i++) { if(map[temp][i]) { if(col[i]==0) { if(col[temp]==1) col[i]=2; if(col[temp]==2) col[i]=1; q.push(i); } else { if(col[i]==col[temp]) return false; } } } } return true; } int main() { int i; while(scanf("%d",&n)!=EOF) { if(n==0) break; memset(map,0,sizeof(map)); memset(col,0,sizeof(col)); scanf("%d",&m); for(i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); map[a][b]=1; map[b][a]=1; } col[0]=1; if(bfs()) printf("BICOLORABLE./n"); else printf("NOT BICOLORABLE./n"); } return 0; }2-sat代码:
#include<stdio.h> #include<vector> #include<string.h> #include<algorithm> #include<stack> using namespace std; int n,m,Index,cnt; int belong[405],dfn[405],low[405]; bool used[405],instack[405]; stack<int>s; vector<int>map[405]; void init() { int i; for(i=0;i<405;i++) map[i].clear(); while(!s.empty()) s.pop(); memset(used,0,sizeof(used)); memset(instack,0,sizeof(instack)); memset(dfn,-1,sizeof(dfn)); memset(low,0,sizeof(low)); memset(belong,0,sizeof(belong)); Index=0; cnt=0; } int min(int a,int b) { if(a>b) return b; else return a; } void tarjan(int u) { int i,v; Index++; dfn[u]=Index; low[u]=Index; used[u]=true; instack[u]=true; s.push(u); for(i=0;i<map[u].size();i++) { v=map[u][i]; if(!used[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(instack[v]) { low[u]=min(low[u],dfn[v]); } } if(dfn[u]==low[u]) { cnt++; do { v=s.top(); s.pop(); belong[v]=cnt; instack[v]=false; } while(u!=v); } } int main() { int i,a,b; while(scanf("%d",&n)!=EOF) { if(n==0) break; init(); scanf("%d",&m); for(i=1;i<=m;i++) { scanf("%d%d",&a,&b); map[a].push_back(b+n); map[a+n].push_back(b); } for(i=0;i<n;i++) if(dfn[i]==-1) tarjan(i); bool flag=true; for(i=0;i<n;i++) { if(belong[i]==belong[i+n]) { printf("NOT BICOLORABLE./n"); flag=false; break; } } if(flag) printf("BICOLORABLE./n"); } return 0; }
相关文章推荐
- uva 10004 Bicoloring(判断一个图是否是二分图)
- 紫书章七例五 Krypton Factor UVA - 129(dfs)判断一个字符串中是否包含两个相邻子串
- uva 11396 爪分解,判断所给图是否能分解成爪,二分图判断
- 紫书章七例五 Krypton Factor UVA - 129(dfs)判断一个字符串中是否包含两个相邻子串
- 判断一个无向图是否为二分图
- HDOJ 2444 - The Accomodation of Students 判断一个图是否是二分图.二分图的条件
- 紫书章七例五 Krypton Factor UVA - 129(dfs)判断一个字符串中是否包含两个相邻子串
- UVA 10006 判断一个数是否为一个卡米切尔数
- 判断一个图是否为二分图且输出结点二分的两个部分(算法导论22.2-6)
- UVA - 10004 Bicoloring(判断二分图——交叉染色法 / 带权并查集)
- 判断一个图是否为二分图
- UVALive 6257 Chemist's vows 判断一个字符串是否由n中的某些字符串组成 dp
- uva 11396判断是否是二分图
- 如何判断一个图是否是二分图
- 紫书章七例五 Krypton Factor UVA - 129(dfs)判断一个字符串中是否包含两个相邻子串
- 紫书章七例五 Krypton Factor UVA - 129(dfs)判断一个字符串中是否包含两个相邻子串
- 紫书章七例五 Krypton Factor UVA - 129(dfs)判断一个字符串中是否包含两个相邻子串
- uva 10004 Bicoloring (二分图染色/求一个二分图)
- 紫书章七例五 Krypton Factor UVA - 129(dfs)判断一个字符串中是否包含两个相邻子串
- 紫书章七例五 Krypton Factor UVA - 129(dfs)判断一个字符串中是否包含两个相邻子串