1242. Werewolf
Time limit: 1.0 second Memory limit: 64 MB
Knife. Moonlit night. Rotten stump with a short black-handled knife in it. Those who know will understand. Disaster in the village. Werewolf.
There are no so many residents in the village. Many of them are each other's relatives. Only this may help to find the werewolf. The werewolf is merciless, but his descendants never become his victims. The werewolf can drown the village in blood, but he never kills his ancestors.
It is known about all the villagers who is the child of whom. Also, the sad list of the werewolf's victims is known. Your program should help to determine the suspects. It would be a hard task, if a very special condition would not hold. Namely, citizens of the village are not used to leave it. If some ancestor of some citizen lives in the village, then also his immediate ancestor does. It means, that, for example, if the father of the mother of some citizen still lives in the village, than also his mother still lives.
Input
The first line contains an integer N, 1 < N ≤ 1000, which is the number of the villagers. The villagers are assigned numbers from 1 to N. Further is the description of the relation "child-parent": a sequence of strings, each of which contains two numbers separated with a space; the first number in each string is the number of a child and the second number is the number of the child's parent. The data is correct: for each of the residents there are no more than two parents, and there are no cycles. The list is followed by the word "BLOOD" written with capital letters in a separate string. After this word there is the list of the werewolf's victims, one number in each string.
Output
The output should contain the numbers of the residents who may be the werewolf. The numbers must be in the ascending order and separated with a space. If there are no suspects, the output should contain the only number 0.
Samples
input | output |
---|---|
8 1 3 3 6 4 5 6 2 4 6 8 1 BLOOD 3 8 |
4 5 7 |
6 1 2 3 2 1 4 3 4 2 6 5 2 5 4 BLOOD 2 5 |
0 |
Problem Author: Leonid Volkov Problem Source: Ural State University Personal Programming Contest, March 1, 20
***********************************************************************************************
链式前向星&&双向深搜(参考了代码,觉得经典)
***********************************************************************************************
1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<cmath> 5 #include<cctype> 6 #include<cstdio> 7 #include<stack> 8 #include<queue> 9 #include<vector> 10 #include<algorithm> 11 using namespace std; 12 struct node//链式前向星 13 { 14 int to; 15 int next; 16 }side1[10050],side2[10050];//定义两个为了向祖先和后裔分别搜 17 int head1[10060],head2[10060]; 18 int n,a,b,x1,x2,g,i,j; 19 bool woof[1000];//标记 20 char str[1000]; 21 void add1(int x,int y)//插数 22 { 23 side1[x1].to=y; 24 side1[x1].next=head1[x]; 25 head1[x]=x1++; 26 } 27 void add2(int x,int y) 28 { 29 side2[x2].to=y; 30 side2[x2].next=head2[x]; 31 head2[x]=x2++; 32 } 33 void dfs1(int x)//父子深搜 34 { 35 woof[x]=true; 36 for(int k=head1[x];k!=-1;k=side1[k].next) 37 dfs1(side1[k].to); 38 } 39 void dfs2(int y) 40 { 41 woof[y]=true; 42 for(int k=head2[y];k!=-1;k=side2[k].next) 43 dfs2(side2[k].to); 44 } 45 bool findrelative(int &L1,int &L2,char *str)//对输入进行处理 46 { 47 int i=0; 48 while(str[i]==' ') 49 i++; 50 if(str[i]=='B') 51 return false; 52 L1=0; 53 while(1) 54 { 55 if(str[i]>'9'||str[i]<'0') 56 break; 57 L1=L1*10+str[i]-'0'; 58 i++; 59 60 } 61 while(str[i]==' ') 62 i++; 63 L2=0; 64 while(1) 65 { 66 if(str[i]>'9'||str[i]<'0') 67 break; 68 L2=L2*10+str[i]-'0'; 69 i++; 70 } 71 return true; 72 } 73 int main() 74 { 75 cin>>n; 76 getchar(); 77 x1=0;x2=0; 78 memset(head1,-1,sizeof(head1)); 79 memset(head2,-1,sizeof(head2)); 80 while(gets(str)) 81 { 82 int h1,h2; 83 if(!findrelative(h1,h2,str)) 84 break; 85 add1(h1,h2);//为了向两个方向搜索有add1,add2 86 add2(h2,h1); 87 } 88 memset(woof,false,sizeof(woof)); 89 while(scanf("%d",&g)!=EOF) 90 { 91 dfs1(g);//两方向深搜 92 dfs2(g); 93 } 94 int ans[100050]; 95 int t=0; 96 for(int i=1;i<=n;i++) 97 { 98 if(woof[i]==false) 99 ans[++t]=i; 100 } 101 if(t==0)//特殊情况的处理 102 { 103 cout<<'0'<<endl; 104 return 0; 105 } 106 sort(ans+1,ans+t+1); 107 for(i=1;i<=t;i++) 108 cout<<ans[i]<<' '; 109 cout<<endl; 110 return 0; 111 112 }