/*
思路: 每个人做为一个顶点,在他们之间建双向边表示关系,最后以1为起点(now==0表示辈分)dfs所有关系,
搜到now>0的就是辈分比1高的
新的知识点:
1.神奇的输入方式
反思:
1.链式前向星建图都不熟QAQ
2.dfs的复杂度不会分析,这个地方不用考虑所有的情况,因为每个能走到的点结果唯一,要么一样,要么辈分小,要么辈分大
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
char s[15];
int s1,s2,n,cnt;
int head[105],vis[105];
struct edge{
int to,ne,w;
}ed[10005];
void add(int x,int y,int k){
ed[cnt].to=y;
ed[cnt].w=k;
ed[cnt].ne=head[x];
head[x]=cnt++;
}
int dfs(int v,int now){
vis[v]=1;
// printf(" v=%d now=%d\n",v,now);
if(now>0) return 1;
for(int i=head[v];~i;i=ed[i].ne){
if(vis[ed[i].to]) continue;
if(dfs(ed[i].to,now+ed[i].w)) return 1;
}
//vis[v]=0;//不用恢复,因为一个结点只有一个结果
return 0;
}
int main()
{
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d is %d's %s",&s1,&s2,&s);
int l=strlen(s);
// printf("%d\n",l);
if(l==4){
add(s1,s2,1);
add(s2,s1,-1);
}
else if(l==7){
add(s1,s2,-1);
add(s2,s1,1);
}
else if(l==8){
add(s1,s2,0);
add(s2,s1,0);
}
else if(l==9){
add(s1,s2,2);
add(s2,s1,-2);
}
else if(l==12){
add(s1,s2,-2);
add(s2,s1,2);
}
}
if(dfs(1,0)) printf("ku jiu ru hou xin zuo tong.");
else printf("2333333...");
return 0;
}
zjnu2017校赛J认亲大会
最新推荐文章于 2019-05-31 11:18:25 发布