A.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAX = 10010;
  4. int du[MAX];
  5. int head[MAX];
  6. struct Edge{
  7. int u,v,to,next;
  8. };
  9. Edge edges[MAX];
  10. int edgeCnt = 0;
  11. void addEdge(int u, int v){
  12. edges[edgeCnt].v = v;
  13. edges[edgeCnt].next = head[u];
  14. head[u] = edgeCnt++;
  15. }
  16. int main(){
  17. // ifstream cin("input.txt");
  18. int t;
  19. cin >> t;
  20. while(t--){
  21. int m = 0;
  22. int n;
  23. cin >> n;
  24. map<string, int>mp;
  25. edgeCnt = 0;
  26. memset(head, -1, sizeof(head));
  27. memset(du, 0, sizeof(du));
  28. string s1, s2;
  29. for(int i = 0; i < n; i++){
  30. cin >> s1 >> s2;
  31. if(mp[s1]==0){
  32. mp[s1] = ++m;
  33. }
  34. if(mp[s2]==0){
  35. mp[s2] = ++m;
  36. }
  37. addEdge(mp[s2], mp[s1]);
  38. du[mp[s1]]++;
  39. }
  40. queue<int>q;
  41. for(int i = 1; i <= m; i++){
  42. if(du[i]==0){
  43. q.push(i);
  44. }
  45. }
  46. int cnt = 0;
  47. while(q.size()>0){
  48. int u = q.front();
  49. q.pop();
  50. cnt++;
  51. for(int i = head[u]; i!=-1; i = edges[i].next){
  52. int v = edges[i].v;
  53. if(!--du[v]){
  54. q.push(v);
  55. }
  56. }
  57. }
  58. if(cnt == m){
  59. cout << "Passed" << endl;
  60. }else{
  61. cout << "Failed" << endl;
  62. }
  63. }
  64. }