Madiyar

Untitled

May 30th, 2013
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <set>
  5. #include <map>
  6. #include <vector>
  7. #include <string>
  8. #include <cmath>
  9. #include <cstring>
  10. #include <queue>
  11. #include <stack>
  12. #include <algorithm>
  13. #include <sstream>
  14. #include <numeric>
  15. using namespace std;
  16.  
  17. #define f first
  18. #define s second
  19. #define mp make_pair
  20. #define sz(a) int((a).size())
  21. #define pb push_back
  22. #define all(c) (c).begin(),(c).end()
  23. #define forit(it,S) for(__typeof(S.begin()) it = S.begin(); it != S.end(); ++it)
  24. #ifdef WIN32
  25.     #define I64d "%I64d"
  26. #else
  27.     #define I64d "%lld"
  28. #endif
  29.  
  30. typedef long long ll;
  31. typedef vector <int> vi;
  32. const int maxn = (int)3e4;
  33.  
  34. pair<int, pair<int, int> > e[maxn];
  35. int emp[maxn];
  36. int d[110][110];
  37. long long a[110][402];
  38. int n, m;
  39.  
  40. bool Ok(int m) {
  41.  
  42.  
  43.     for (int i = 1; i <= n; ++i)    
  44.         emp[i] = false;
  45.    
  46.     for (int i = 1; i <= n; ++i)
  47.         for (int j = 0; j < 400; ++j)
  48.             a[i][j] = 0;
  49.            
  50.     for (int i = 1; i <= n; ++i)
  51.         for (int j = 1; j <= n; ++j)
  52.             d[i][j] = (i == j);
  53.            
  54.     for (int i = 0; i < m; ++i) {
  55.         int u = e[i].s.f, v = e[i].s.s;
  56.        
  57.         if (e[i].f == 1)
  58.             d[u][v] = 1;
  59.            
  60.         if (e[i].f == 2)
  61.             d[u][v] = d[v][u] = 1;     
  62.     }
  63.    
  64.     for (int k = 1; k <= n; ++k)
  65.         for (int i = 1; i <= n; ++i)
  66.             for (int j = 1; j <= n; ++j)
  67.                 d[i][j] |= (d[i][k] & d[k][j]);
  68.                                
  69.     for (int i = 0; i < m; ++i) if (e[i].f == 3) {
  70.         int u = e[i].s.f, v = e[i].s.s;
  71.         if (d[u][v] && d[v][u]) return false;
  72.     }
  73.    
  74.     int k = 0;
  75.     for (int i = 0; i < m; ++i) if (e[i].f == 5) {
  76.         int u = e[i].s.f, v = e[i].s.s;    
  77.         ++k;
  78.         for (int t = 1; t <= n; ++t)
  79.             if (d[u][t] || d[v][t]) {
  80.                 a[t][k >> 5] |= (1ll << (k & 31));
  81.             }
  82.     }
  83.    
  84.     for (int i = 0; i < m; ++i) if (e[i].f == 4) {
  85.         int u = e[i].s.f, v = e[i].s.s;
  86.        
  87.         for (int j = 0; j < 400; ++j)
  88.             if ((a[u][j] & a[v][j]) > 0) return false;
  89.  
  90.         if (!d[u][v]) swap(u, v);
  91.         if (!d[u][v]) continue;
  92.        
  93.         emp[u] = true;
  94.         for (int t = 1; t <= n; ++t)
  95.             if (d[t][u]) emp[t] = true;                                        
  96.     }              
  97.    
  98.     for (int i = 0; i < m; ++i) if (e[i].f == 3) {
  99.         int u = e[i].s.f, v = e[i].s.s;
  100.         if (emp[u] && emp[v]) return false;
  101.     }
  102.    
  103.  
  104.     return true;
  105.        
  106.    
  107. }
  108. void Solve() {
  109.  
  110.     for (int i = 0; i < m; ++i) {
  111.         int type, u, v;
  112.         scanf("%d%d%d", &type, &u, &v);
  113.         e[i] = mp(type, mp(u, v));
  114.     }
  115.    
  116.     int le = 0, ri = m;
  117.     while (ri - le > 1) {
  118.         int mid = (le + ri) >> 1;
  119.         if (Ok(mid + 1)) le = mid; else
  120.         ri = mid;
  121.     }  
  122.     printf("%d\n", le + 1);
  123. }
  124. int main() {
  125.  
  126.     for (int test = 1;;++test) {
  127.         scanf("%d%d", &n, &m);
  128.         if (n == 0) break;
  129.         Solve();
  130.     }
  131.     return 0;      
  132. }
Advertisement
Add Comment
Please, Sign In to add comment