IQOverload

zoj_2639

Sep 6th, 2014
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.95 KB | None | 0 0
  1. #include <algorithm>
  2. #include <bitset>
  3. #include <deque>
  4. #include <cmath>
  5. #include <cstdio>
  6. #include <cstdlib>
  7. #include <cstring>
  8. #include <iostream>
  9. #include <list>
  10. #include <map>
  11. #include <queue>
  12. #include <set>
  13. #include <sstream>
  14. #include <stack>
  15. #include <string>
  16. #include <utility>
  17. #include <vector>
  18.  
  19. #define fst first
  20. #define snd second
  21. #define all(x) (x).begin(), (x).end()
  22. #define clr( a , v ) memset( a , v , sizeof(a) )
  23. #define pb push_back
  24. #define mp make_pair
  25. #define sz size()
  26. #define FORN( i , s , n ) for( int i = s ; i < (int)(n) ; i++ )
  27. #define FOR( i , n ) FORN( i , 0 , n )
  28. #define FORIT(i,x) for( typeof x.begin() i = x.begin() ; i != x.end() ; i++ )
  29. #define trace(x)    cerr << #x << ": " << x << endl;
  30. #define trace2(x, y) cerr << #x << ": " << x << " | " << #y << ": " << y << endl;
  31. #define read ios::sync_with_stdio(false)
  32.  
  33. using namespace std;
  34.  
  35. typedef long long int64;
  36. typedef vector <int> vi;
  37. typedef pair <int,int> ii;
  38. typedef vector <string> vs;
  39. typedef vector <ii> vii;
  40.  
  41. const int MAX = 20001;
  42.  
  43. int low[MAX], d[MAX];
  44. int usd[MAX], prev[MAX], cnt;
  45. vector <int> adj[MAX];
  46. stack <ii> S;
  47. string ans;
  48.  
  49. string sum( string a , string b ){
  50.     string tmp = "";
  51.     int carry = 0, d;
  52.     if( a.sz > b.sz ){
  53.         int n = a.sz - b.sz;
  54.         FOR( i , n ) b += "0";
  55.     }
  56.     if( a.sz < b.sz ){
  57.         int n = b.sz - a.sz;
  58.         FOR( i , n ) a += "0";
  59.     }
  60.     FOR( i , a.sz ){
  61.         d = ( a[i]-'0' ) + (b[i]-'0') + carry;
  62.         carry = d / 10;
  63.         d = d % 10;
  64.         tmp += (d+'0');
  65.     }
  66.     if( carry ) tmp += "1";
  67.     return tmp;
  68. }
  69.  
  70. string mult( string a , int n ){
  71.     if( n == 0 ) return "0";
  72.     if( n == 1 ) return a;
  73.     if( n % 2 ) return sum( a , mult( a , n-1 ) );
  74.     string b = mult( a , n/2 );
  75.     return sum( b , b );
  76. }
  77.  
  78.  
  79. void Outcomp( int u , int v ){
  80.     pair <int,int> e;
  81.     int edges = 0; set <int> vert;
  82.     do{
  83.         e = S.top(); S.pop();
  84.         edges++;
  85.         vert.insert(e.fst);
  86.         vert.insert(e.snd);
  87.     } while( e != mp( u , v ) );
  88.    
  89.     if( edges <= 1 ) return;
  90.     if( edges == vert.sz ){
  91.         ans = mult ( ans , ( edges + 1 ) );
  92.     } else ans = "0";
  93. }
  94.  
  95. void dfs( int u ){
  96.     usd[u] = 1; cnt++;
  97.     low[u] = d[u] = cnt;
  98.     FOR( i , adj[u].sz ){
  99.         int v = adj[u][i];
  100.         if( !usd[v] ){
  101.             S.push( mp( u , v ) );
  102.             prev[v] = u; dfs( v );
  103.             if( low[v] >= d[u] ) Outcomp( u , v );
  104.             low[u] = min( low[u] , low[v] );
  105.         }
  106.         else if( prev[u] != v and d[v] < d[u] ){
  107.             S.push( mp( u , v ) );
  108.             low[u] = min( low[u] , d[v] );
  109.         }
  110.     }
  111. }
  112.  
  113. int main(){
  114.     int n, m;
  115.     while( scanf("%d %d", &n, &m) != EOF ){
  116.         FOR( i , n ) adj[i].clear();
  117.         FOR( i , m ){
  118.             int k, a , b;
  119.             scanf("%d %d", &k, &a); a--;
  120.             FOR( i , k-1 ){
  121.                 scanf("%d", &b); b--;
  122.                 adj[a].pb(b);
  123.                 adj[b].pb(a);
  124.                 a = b;
  125.             }
  126.         }
  127.  
  128.         cnt = 0;
  129.         int comp = 0;
  130.         clr( usd , 0 );
  131.         clr( prev , -1 );
  132.         ans = "1";
  133.  
  134.         FOR( i , n ){
  135.             if( !usd[i] ){
  136.                 comp++;
  137.                 if( comp > 1 ){
  138.                     ans = "0"; break;
  139.                 }
  140.                 dfs(i);
  141.             }
  142.         }
  143.         reverse( all (ans) );
  144.         cout << ans << endl;
  145.     }
  146.     return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment