[HDU] 2094 产生冠军(拓扑排序+map)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2094
注意每组数据处理前,map要清空。
1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 #include<stdbool.h> 7 #include<time.h> 8 #include<stdlib.h> 9 #include<set> 10 #include<map> 11 #include<stack> 12 #include<queue> 13 #include<vector> 14 using namespace std; 15 #define clr(x,y) memset(x,y,sizeof(x)) 16 #define sqr(x) ((x)*(x)) 17 #define rep(i,a,b) for(int i=(a);i<=(b);i++) 18 #define LL long long 19 #define INF 0x3f3f3f3f 20 #define A first 21 #define B second 22 const int N=1000+131; 23 int n,cnt,num,t,head[N],f[N],d[N]; 24 char a[N],b[N]; 25 map<string,int> all; 26 27 void init() 28 { 29 num=0; 30 clr(d,0); 31 all.clear(); 32 } 33 void solve() 34 { 35 int p=0; 36 for(int i=1;i<=num;i++) { 37 if(!d[i]) p++; 38 } 39 if(p!=1) printf("No\n"); 40 else printf("Yes\n"); 41 42 } 43 int main() 44 { 45 while(~scanf("%d",&n)) { 46 if(!n) break; 47 getchar(); 48 init(); 49 while(n--) { 50 scanf("%s%s",a,b); 51 if(!all[a]) all[a]=++num; 52 if(!all[b]) all[b]=++num; 53 d[all[b]]++; 54 } 55 solve(); 56 } 57 58 return 0; 59 }