ZJNU 2133 - 认亲大会

将辈分差距转为数字

例如 A 是 B son

A=B-1

A 是 B grandfather

A=B+2
然后编号1数字设置为0,建图bfs

最后搜索编号2到100是否存在>0的数即可

 1 /*
 2 Written By. StelaYuri
 3 On 2020/01/15
 4 */
 5 #include<bits/stdc++.h>
 6 using namespace std;
 7 typedef pair<int,int> P;
 8 vector<P> v[105];
 9 queue<int> q;
10 int dis[105];
11 bool vis[105];
12 int main(){
13     memset(dis,0x3f,sizeof dis);
14     int N,i,now,cnt,a,b;
15     char s[15];
16     scanf("%d",&N);
17     while(N--){
18         scanf("%d is %d's %s",&a,&b,s);
19         if(strcmp(s,"father.")==0){
20             v[a].push_back(P(b,-1));
21             v[b].push_back(P(a,1));
22         }
23         else if(strcmp(s,"son.")==0){
24             v[a].push_back(P(b,1));
25             v[b].push_back(P(a,-1));
26         }
27         else if(strcmp(s,"brother.")==0){
28             v[a].push_back(P(b,0));
29             v[b].push_back(P(a,0));
30         }
31         else if(strcmp(s,"grandson.")==0){
32             v[a].push_back(P(b,2));
33             v[b].push_back(P(a,-2));
34         }
35         else if(strcmp(s,"grandfather.")==0){
36             v[a].push_back(P(b,-2));
37             v[b].push_back(P(a,2));
38         }
39     }
40     vis[1]=true;
41     dis[1]=0;
42     q.push(1);
43     while(!q.empty()){
44         now=q.front();
45         q.pop();
46         cnt=v[now].size();
47         for(i=0;i<cnt;i++)
48             if(!vis[v[now][i].first]){
49                 vis[v[now][i].first]=true;
50                 dis[v[now][i].first]=dis[now]+v[now][i].second;
51                 q.push(v[now][i].first);
52             }
53     }
54     bool flag=true;
55     for(i=2;i<=100;i++)
56         if(dis[i]!=0x3f3f3f3f&&dis[i]>0){
57             flag=false;
58             break;
59         }
60     puts(flag?"2333333...":"ku jiu ru hou xin zuo tong.");
61     
62     return 0;
63 }

猜你喜欢

转载自www.cnblogs.com/stelayuri/p/12236294.html