题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1080
其实这道题用BFS或者DFS都行,也就是二分图 昨晚建图时建成了单向图,唉 还以为算法或者题理解错了呢
DFS
View Code
BFS(快)
View Code
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 int map[105][105]; 7 int pay[105]; 8 int n; 9 queue<int>Q; 10 void init() 11 { 12 13 memset(pay,-1,sizeof(pay)); 14 memset(map,0,sizeof(map)); 15 while (!Q.empty()) 16 { 17 Q.pop(); 18 } 19 } 20 int BFS(int x) 21 { 22 int i,v; 23 Q.push(x); 24 pay[x]=0; 25 while (!Q.empty()) 26 { 27 v=Q.front(); 28 Q.pop(); 29 for(i=1;i<=n;i++) 30 { 31 if(map[v][i]) 32 { 33 if(pay[i]==-1) 34 { 35 36 pay[i]=1-pay[v]; 37 Q.push(i); 38 } 39 else if(pay[v]==pay[i]) return 0; 40 } 41 } 42 } 43 return 1; 44 } 45 int main() 46 { 47 int k,i,x; 48 while (scanf("%d",&n)!=EOF) 49 { 50 init(); 51 for (i=1;i<=n;i++) 52 { 53 while (scanf("%d",&x),x) 54 { 55 map[i][x]=1; 56 map[x][i]=1; 57 } 58 } 59 k=BFS(1); 60 61 if(k==0){printf("-1\n");continue;} 62 for (i=1;i<=n;i++) 63 printf("%d",pay[i]); 64 printf("\n"); 65 } 66 return 0; 67 }