比赛的时候数据错了、、好坑爹、越想越复杂、、、→_→
其实就是一次BFS求出层次图、然后判断、、、
#include<stdio.h> #include<string.h> #include<string> #include<map> #include<queue> #include<algorithm> using namespace std; #define INF 0x7fffffff #define LL long long int int n,m; const int N=10005; int k; struct node { int to,next,val; }edge[N]; int head[N]; int level[N]; void init() { k=0; memset(head,-1,sizeof(head)); } void add(int x,int y,int val) { edge[k].to=y; edge[k].val=val; edge[k].next=head[x]; head[x]=k++; } void bfs(int start) { queue<int>q; level[1]=1; q.push(1); while(!q.empty()) { int now=q.front(); q.pop(); for(int i=head[now];i!=-1;i=edge[i].next) { int s=edge[i].to; level[s]=level[now]+1; q.push(s); } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { map<string,int>M; M["Hungar"]=1; char str1[15]; char str2[15]; int cnt=2; init(); for(int i=1;i<=n;i++) { scanf("%s%s",str1,str2); if(M[str1]==0)M[str1]=cnt++; if(M[str2]==0)M[str2]=cnt++; add(M[str2],M[str1],1); } bfs(1); int ans=0; for(int i=1;i<=m;i++) { scanf("%s%s",str1,str2); if(level[M[str1]]<=level[M[str2]])ans++; } printf("%d\n",ans); } return 0; }