hdu3062 Party
来源:互联网 发布:成人频道直播软件 编辑:程序博客网 时间:2024/04/30 06:23
#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <stack>using namespace std;const int M = 2005;int ins[M];int dfn[M];int low[M];int sccf[M];vector<int>que[M];stack<int>s;int index, cont;int flag;int n, m;void init() { int a, b, c, d; index = 1; cont = 0; for(int i = 0; i < n*2; i++) { que[i].clear(); } for(int i = 0; i < m; i++) { scanf("%d%d%d%d", &a, &b, &c, &d); int u = a*2 + c; int v = b*2 + d; que[u].push_back(v^1); que[v].push_back(u^1); }}void Tanjian(int u) { int v; dfn[u] = low[u] = index++; s.push(u); ins[u] = 1; for(int i = 0; i < que[u].size(); i++) { v = que[u][i]; if(!dfn[v]) { Tanjian(v); low[u] = min(low[u], low[v]); } else if(ins[v]) { low[u] = min(low[u], low[v]); } } if(dfn[u] == low[u]) { cont++; do { v = s.top(); s.pop(); sccf[v] = cont; ins[v] = 0; }while(v != u); }}void solve() { memset(ins, 0, sizeof(ins)); memset(low, 0, sizeof(low)); memset(dfn, 0, sizeof(dfn)); memset(sccf, 0, sizeof(sccf)); for(int i = 0; i < 2*n; i++) { if(!dfn[i]) { Tanjian(i); } } flag = 1; for(int i = 0; i < 2*n; i+= 2) { if(sccf[i] == sccf[i^1]) { flag = 0; break; } } if(flag) printf("YES\n"); else printf("NO\n");}int main(){ while(scanf("%d", &n) != EOF) { scanf("%d", &m); init(); solve(); } return 0;}