3 Alice Bob Smith John Alice Smith 5 a c c d d e b e a d 0
Yes No
拓扑排序,这个题本来是非常简单的判断有向图是否只有一个入度为零的点,但是考察上了字符串的编号,还是果断用了c++里面的map,这样编号会更方便一下,很多时候都用到这个,现在学学也不算晚了,迟早都要接触的,大概解释一下自己对map的理解
map,就是一一对应,你把两个变量赋给他,他可以同时记录下来这两个变量,也就相当于把这两个变量放在了一起,在使用的时候,直接调用一个,也就相当于用另外一个,一般用于给字符串编号,如果字符串相同的,那么这个对应已经存在,你可以找到,否则你就可以手动给他一个编号,这样在处理的时候,就相当于把这个字符串贴上了一个编号,处理的时候就比较方便了,今天第一次用map,理解的还不够,慢慢学习吧
#include<stdio.h> #include<string.h> #include<string> #include<map> using namespace std; int main() { int m,i,n,ind[1005],j; while(scanf("%d",&m),m) { getchar(); map<string,int> st; memset(ind,0,sizeof(ind)); n=0; for(i=0;i<m;++i) { char a[105],b[105]; scanf("%s%s",a,b); if(!st.count(a))//查找是否出现过 { st[a]=n++;//编号 } if(!st.count(b)) { st[b]=n++; } int x=st[b];//取编号 ind[x]=1;//只要有入度,就标记对应位置上 } int cnt=0; for(i=0;i<n;++i) { if(ind[i]==0)//统计入度为零的点 { ++cnt; } } if(cnt!=1)//只有有一个入度为零的时候才满足 { printf("No\n"); continue; } printf("Yes\n"); } return 0; }