Advertisement
royalsflush

X-mart AC

Sep 2nd, 2012
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.62 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <algorithm>
  3. #include <string.h>
  4. #include <vector>
  5. #include <stack>
  6. using namespace std;
  7.  
  8. #define MAXP 10010
  9.  
  10. int c,p;
  11. vector<int> adj[2*MAXP];
  12. int num[2*MAXP];
  13. int low[2*MAXP];
  14. int scc[2*MAXP];
  15. stack<int> s;
  16. int inSt[2*MAXP];
  17. int nDfs, nScc;
  18.  
  19. inline int neg(int x) {
  20.     return x+p;
  21. }
  22.  
  23. void addEdge(int a, int b, bool del) {
  24.     if (!a && !b) return;
  25.     if (a>b) swap(a,b);
  26.    
  27.     if (!a) {
  28.         if (del) adj[b-1].push_back(neg(b-1));
  29.         else adj[neg(b-1)].push_back(b-1);
  30.         return;
  31.     }
  32.  
  33.     if (del) {
  34.         adj[b-1].push_back(neg(a-1));
  35.         adj[a-1].push_back(neg(b-1));
  36.     }
  37.     else {
  38.         adj[neg(b-1)].push_back(a-1);
  39.         adj[neg(a-1)].push_back(b-1);
  40.     }
  41. }
  42.  
  43. void tarjanScc(int v) {
  44.     num[v]=low[v]=nDfs++;
  45.     s.push(v), inSt[v]=true;
  46.    
  47.     for (int i=0; i<(int)adj[v].size(); i++) {
  48.         int w=adj[v][i];
  49.  
  50.         if (num[w]==-1) {
  51.             tarjanScc(w);
  52.             low[v]=min(low[v],low[w]);
  53.         }
  54.         else
  55.             if (inSt[w])
  56.                 low[v]=min(low[v],num[w]);
  57.     }
  58.  
  59.     if (low[v]==num[v]) {
  60.         int t;
  61.         do {
  62.             t=s.top();
  63.             inSt[t]=false;
  64.             scc[t]=nScc;
  65.             s.pop();
  66.         } while (t!=v);
  67.    
  68.         nScc++;
  69.     }
  70. }
  71.  
  72. int main() {
  73.     while (1) {
  74.         scanf("%d %d", &c,&p);
  75.         if (!c && !p) break;
  76.  
  77.         for (int i=0; i<2*p; i++)
  78.             adj[i].clear();
  79.  
  80.         for (int i=0; i<c; i++) {
  81.             int X,Y,S,T;
  82.             scanf("%d %d %d %d", &X,&Y,&S,&T);
  83.            
  84.             addEdge(X,Y,false);
  85.             addEdge(S,T,true);
  86.         }
  87.  
  88.         memset(num,-1,sizeof(num));
  89.         memset(low,-1,sizeof(low));
  90.         memset(inSt,false,sizeof(inSt));
  91.         while (!s.empty()) s.pop();
  92.         nDfs=0, nScc=0;
  93.  
  94.         for (int i=0; i<2*p; i++)
  95.             if (num[i]==-1) tarjanScc(i);
  96.         bool sat=true;     
  97.  
  98.         for (int i=0; i<p; i++)
  99.             sat=sat&&(scc[i]!=scc[neg(i)]);
  100.  
  101.         printf("%s\n", sat? "yes":"no");
  102.     }
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement