acm.sgu.ru/problem.php?contest=0&problem=121
要求与每个点相连的边必须有黑白两个颜色,那么我们交替染色必可以满足条件,是一个深搜题。先搜遍奇数点再搜偶数点,这样不会造成搜到环路而停止的结果,一定可以将所有的边均染上色,然后检验是否符合条件。
#include <vector>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <sstream>
using namespace std;
const int N = 110;
int n;
int deg[N];
int G[N][N];
int color[N][N];
void DFS(int i, int c){
c = 3 - c;//一直以为只能用异或,还想等价变为0 1来着,真是蠢啊
for(int k=1; k<=deg[i]; k++){
int j = G[i][k];
if(!color[i][j]){
color[i][j] = color[j][i] = c;
DFS(j, c);
c = 3 - c;//保证回溯时也是交替染色
}
}
}
int main(){
scanf("%d",&n);
int v;
for(int i=1; i<=n; i++)
while(scanf("%d",&v) && v)
G[i][++deg[i]] = v;
for(int i=1; i<=n; i++)
if(deg[i] & 1) DFS(i, 1);
for(int i=1; i<=n; i++) DFS(i, 1);
for(int i=1; i<=n; i++){//check
if(deg[i] > 1){
int t = 0;
for(int j=1; j<=deg[i]; j++)
t |= color[i][G[i][j]];//只有1|2才会得出3 即满足题意
if(t != 3){
puts("No solution");
return 0;
}
}
}
for (int i = 1; i <= n; ++i){
for (int j = 1; j <= deg[i]; ++j)
printf("%d ", color[i][G[i][j]]);
printf("0\n");
}
return 0;
}