najim

1168 - Wishing Snake

May 29th, 2014
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.51 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define SYN ios_base::sync_with_stdio(0);cin.tie(0);
  3. using namespace std;
  4. /***************************************************************************************************************************************/
  5. typedef long long int LLI;
  6. typedef unsigned long long int ULLI;
  7. #define IMAX ((unsigned)1<<31)-1
  8. #define eps 1e-11
  9. #define LIMAX (1LL<<63)-1
  10. #define ULIMAX (1LL<<64)-1
  11. #define UIMAX ((LLI)1<<32)-1
  12. #define MP(X,Y) make_pair(X,Y)
  13.  
  14. #define REP(i,n) for(int i=0;i<n;i++)
  15. #define DREP(i,n) for(int i=n;i>=0;i--)
  16. #define LREP(i,a,b) for(int i=a;i<=b;i++)
  17. #define DLREP(i,a,b) for(int i=a;i>=b;i--)
  18. #define FOR(i,a,b,c) for(int i=a;i<=b;i+=c)
  19.  
  20. #define fill(a,v) memset(a,v,sizeof(a))
  21. #define DEBUG(x) cout << #x << ": " << x << endl;
  22. #define SZ(X) ((int)X.size())
  23. #define all(x) (x).begin(),(x).end()
  24. #define SORT(x) sort(all(x))
  25. #define VI vector<int>
  26. #define VS vector<string>
  27. #define PB push_back
  28. #define REV(a) reverse(all(a))
  29. typedef pair<int, int>PII;
  30. typedef pair<LLI, LLI>PLL;
  31. typedef pair<char, int>PCI;
  32. typedef pair<int, char>PIC;
  33. typedef pair<double, double>PDD;
  34. #define MSI map<string,int>
  35. #define MSLI map<string,LLI>
  36. #define MCI map<char,int>
  37. template<class T> inline T MIN_3(T a, T b, T c){return min(min(a, b), c);}
  38. template<class T> inline T MAX_3(T a, T b, T c){return max(max(a, b), c);}
  39. #define ACM(x) accumulate(all(x),0);
  40. #define CAP(x,y,z) set_intersection (all(x), all(y), z.begin())
  41. #define CUP(x,y,z) set_union(all(x),all(y),z.begin())
  42. #define DIF(x,y,z) set_difference (all(x),all(y),z.begin());
  43. #define BRPS(n,bit) bitset<bit>(n)
  44. #define DSORT(X)  sort(X.rbegin(), X.rend());
  45. #define read(x) freopen(#x".txt","r",stdin)
  46. #define write(x) freopen(#x".txt","w",stdout)
  47. #define LB(A, x) (lower_bound(all(A), x) - A.begin())//exactly where it starts
  48. #define UB(A, x) (upper_bound(all(A), x) - A.begin())
  49. #define UNQ(x) SORT(x),(x).erase(unique(all(x)),x.end())
  50.  
  51. template<class T> inline T BIGMOD(T n, T m, T mod)
  52. {
  53.     LLI ans = 1;
  54.     LLI k = n;
  55.     while(m){
  56.         if(m & 1) {
  57.             ans *= k;
  58.             if(ans>mod) ans %= mod;
  59.         }
  60.         k *= k;
  61.         if(k>mod) k %= mod;
  62.         m >>= 1;
  63.     }
  64.     return ans;
  65. }
  66.  
  67.  
  68. inline int DBLCMP(double a, double b){
  69.     if(fabs(a - b) <= eps) return 0;
  70.     if(a < b) return -1;
  71.     return 1;
  72. }
  73. template<class T> inline T sqr(T x){return x*x;}
  74. template<class T> inline int countbit(T n){return (n == 0) ? 0 : (1 + countbit(n&(n - 1)));}
  75. template<class T> inline T euclide(T a, T b, T &x, T &y)
  76. {
  77.     if (a < 0){T d = euclide(-a, b, x, y);x = -x;return d;}
  78.     if (b < 0){T d = euclide(a, -b, x, y);y = -y;return d;}
  79.     if (b == 0){x = 1;y = 0;return a;}
  80.     else{T d = euclide(b, a % b, x, y);T t = x;x = y;y = t - (a / b) * y;return d;}
  81. }
  82. template<class T> string toString(T n){ostringstream ost;ost << n;ost.flush();return ost.str();}
  83. template<class T> string toBinary(T n)
  84. {
  85.     string ret="";
  86.     while(n)
  87.     {
  88.         if(n%2==1)ret+='1';
  89.         else ret+='0';
  90.         n>>=1;
  91.     }
  92.     reverse(ret.begin(),ret.end());
  93.     return ret;
  94. }
  95. void combination(int n,vector< vector<int> > &ret)
  96. {
  97.     ret.resize(n+1, vector<int>(n+1, 0));
  98.     for(int i=1;i<=n;i++)
  99.     {
  100.         ret[i][0]=ret[i][i]=1;
  101.         for(int j=1;j<i;j++)
  102.         {
  103.             ret[i][j]=ret[i-1][j]+ret[i-1][j-1];
  104.         }
  105.     }
  106. }
  107. int toInt(string s){int r = 0;istringstream sin(s);sin >> r;return r;}
  108. LLI toLInt(string s){LLI r = 0;istringstream sin(s);sin >> r;return r;}
  109. double toDouble(string s){double r = 0;istringstream sin(s);sin >> r;return r;}
  110. vector<string> parse(string temp){vector<string> ans;ans.clear();string s;istringstream iss(temp);while (iss >> s)ans.PB(s);return ans;}
  111. template<class T> inline T gcd(T a, T b){if (a < 0)return gcd(-a, b);if (b < 0)return gcd(a, -b);return (b == 0) ? a : gcd(b, a % b);}
  112. template<class T> inline T lcm(T a, T b){if (a < 0)return lcm(-a, b);if (b < 0)return lcm(a, -b);return a*(b / gcd(a, b));}
  113. template<class T> inline T power(T b, T p){if (p < 0)return -1;if (b <= 0)return -2;if (!p)return 1;return b*power(b, p - 1);}
  114. #define fst first
  115. #define snd second
  116. //istringstream(temp) >> data >> value >> stamp;
  117. //mod1 = 1000000007, mod2 = 1000000009;
  118. //.016-.040-.900-2.48
  119. /***************************************************************************************************************************************/
  120. const int MAX = 2002;
  121. int Stack[MAX], top;
  122. int Index[MAX], Lowlink[MAX];
  123. bool Onstack[MAX];
  124. int Component[MAX];
  125. int idx, components;
  126. vector< int > G[MAX],GO[MAX];
  127. pair<int,int>Edges[10002];int edg;
  128.  
  129. void tarjan(int u)
  130. {
  131.     int v, i, sz = G[u].size();
  132.     Index[u] = Lowlink[u] = idx++;
  133.     Stack[top++] = u;
  134.     Onstack[u] = 1;
  135.     for(i = 0; i < sz; i++)
  136.     {
  137.         v = G[u][i];
  138.         if(Index[v]==-1)
  139.         {
  140.             tarjan(v);
  141.             Lowlink[u] = min(Lowlink[u], Lowlink[v]);
  142.         }
  143.         else if(Onstack[v]) Lowlink[u] = min(Lowlink[u], Index[v]);
  144.     }
  145.     if(Lowlink[u] == Index[u])
  146.     {
  147.         components++;
  148.         do
  149.         {
  150.             v = Stack[--top];
  151.             Onstack[v] = 0;
  152.             Component[v] = components;
  153.         }
  154.         while(u != v);
  155.     }
  156. }
  157. void findSCC(int n)
  158. {
  159.     components = top = idx = 0;
  160.     memset(Index, -1, sizeof Index);
  161.     memset(Onstack, 0, sizeof Onstack);
  162.     memset(Lowlink, 0x3f, sizeof Lowlink);
  163.     for(int i = 0; i <= n; i++) if(Index[i]==-1 && !G[i].empty()) tarjan(i);
  164. }
  165.  
  166. bool dfs(int cn,int l)
  167. {
  168.     //getchar();
  169.     //cout << cn << " " << l << endl;
  170.     if(l==1 && G[cn].size()==0)return 1;
  171.     if(GO[cn].size()!=1)return false;
  172.     return dfs(GO[cn][0],l-1);
  173. }
  174. int main()
  175. {
  176.     int kase,ks=0;
  177.     scanf("%d",&kase);
  178.     int n, e, i, u, v,a,x,y;
  179.     while(kase--)
  180.     {
  181.         scanf("%d",&n);
  182.         for(int i=0;i<=2000;i++)
  183.         {
  184.             G[i].clear();
  185.             GO[i].clear();
  186.         }
  187.         edg=0;
  188.         for(int i=0;i<n;i++)
  189.         {
  190.             scanf("%d",&a);
  191.             for(int j=0;j<a;j++)
  192.             {
  193.                 scanf("%d %d",&x,&y);
  194.                 G[x].push_back(y);
  195.                 Edges[edg++]=make_pair(x,y);
  196.             }
  197.         }
  198.         findSCC(1001);
  199.         int u,v;
  200.         for(int i=0;i<edg;i++)
  201.         {
  202.             u=Edges[i].fst;
  203.             v=Edges[i].snd;
  204.             if(Component[u]!=Component[v])
  205.             {
  206.                 GO[Component[u]].PB(Component[v]);
  207.             }
  208.         }
  209.         printf("Case %d: ",++ks);
  210.         if(dfs(Component[0],components))puts("YES");
  211.         else puts("NO");
  212.  
  213.  
  214.     }
  215.     return 0;
  216. }
  217. /*
  218. 1
  219. 1
  220. 1
  221. 0 1
  222. */
Advertisement
Add Comment
Please, Sign In to add comment