Bicoloring |
- 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
题意:输入n个点,m组数据,然后有两种不同的颜色,n个点可能相互相邻。要求相邻的两个点不能用一种颜色,问是否可以做到,可以做到输出
代码:
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<math.h> using namespace std; int n,m; int map[205][205]; int v[205]; void BFS() { int p[100010]; for(int i=0;i<n;i++) { p[i] = -1; } memset(v,0,sizeof(v)); queue<int>q; int flag = 0; int t,f; t = 0; p[t] = 0; q.push(t); v[t] = 1; while(!q.empty()) { t = q.front(); q.pop(); for(int i=0;i<n;i++) { if(map[t][i] == 1) { if(p[i] == -1) { p[i] = (int)fabs(p[t] - 1); q.push(i); } else if(p[t] == p[i]) { flag = 1; break; } } } if(flag == 1) { break; } } if(flag == 1) { printf("NOT BICOLORABLE.\n"); } else { printf("BICOLORABLE.\n"); } } int main() { while(scanf("%d",&n)!=EOF) { if(n == 0) { break; } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { map[i][j] = 0; } } scanf("%d",&m); int a,b; for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); map[a][b] = 1; map[b][a] = 1; } BFS(); } return 0; }
时间: 2024-10-15 18:45:46