Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <algorithm>
- #include <string.h>
- #include <vector>
- #include <stack>
- using namespace std;
- #define MAXP 10010
- int c,p;
- vector<int> adj[2*MAXP];
- int num[2*MAXP];
- int low[2*MAXP];
- int scc[2*MAXP];
- stack<int> s;
- int inSt[2*MAXP];
- int nDfs, nScc;
- inline int neg(int x) {
- return x+p;
- }
- void addEdge(int a, int b, bool del) {
- if (!a && !b) return;
- if (a>b) swap(a,b);
- if (!a) {
- if (del) adj[b-1].push_back(neg(b-1));
- else adj[neg(b-1)].push_back(b-1);
- return;
- }
- if (del) {
- adj[b-1].push_back(neg(a-1));
- adj[a-1].push_back(neg(b-1));
- }
- else {
- adj[neg(b-1)].push_back(a-1);
- adj[neg(a-1)].push_back(b-1);
- }
- }
- void tarjanScc(int v) {
- num[v]=low[v]=nDfs++;
- s.push(v), inSt[v]=true;
- for (int i=0; i<(int)adj[v].size(); i++) {
- int w=adj[v][i];
- if (num[w]==-1) {
- tarjanScc(w);
- low[v]=min(low[v],low[w]);
- }
- else
- if (inSt[w])
- low[v]=min(low[v],num[w]);
- }
- if (low[v]==num[v]) {
- int t;
- do {
- t=s.top();
- inSt[t]=false;
- scc[t]=nScc;
- s.pop();
- } while (t!=v);
- nScc++;
- }
- }
- int main() {
- while (1) {
- scanf("%d %d", &c,&p);
- if (!c && !p) break;
- for (int i=0; i<2*p; i++)
- adj[i].clear();
- for (int i=0; i<c; i++) {
- int X,Y,S,T;
- scanf("%d %d %d %d", &X,&Y,&S,&T);
- addEdge(X,Y,false);
- addEdge(S,T,true);
- }
- memset(num,-1,sizeof(num));
- memset(low,-1,sizeof(low));
- memset(inSt,false,sizeof(inSt));
- while (!s.empty()) s.pop();
- nDfs=0, nScc=0;
- for (int i=0; i<2*p; i++)
- if (num[i]==-1) tarjanScc(i);
- bool sat=true;
- for (int i=0; i<p; i++)
- sat=sat&&(scc[i]!=scc[neg(i)]);
- printf("%s\n", sat? "yes":"no");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement