#include<cstdio>
#include<cstring>
#include<iostream>
#include<iomanip>
#include<queue>
#include<cmath>
#include<stack>
#include<map>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
typedef long long LL;
const int int_max = 0x07777777;
const int int_min = 0x80000000;
int smaller (int a, int b) { return (a > b ? b : a); }
int bigger (int a, int b) { return (a > b ? a : b); }
const int maxn = 200005;
int n,m;
vector<int> g[maxn];
int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt;
stack<int> S;
void dfs (int u){
pre[u] = lowlink[u] = ++dfs_clock;
S.push(u);
for(int i = 0; i < g[u].size(); i++){
int v = g[u][i];
if(!pre[v]){
dfs(v);
lowlink[u] = smaller(lowlink[u], lowlink[v]);
}else if(!sccno[v]){
lowlink[u] = smaller(lowlink[u], pre[v]);
}
}
if(lowlink[u]==pre[u]){
scc_cnt++;
while (true) {
int x = S.top();
S.pop();
sccno[x] = scc_cnt;
if(x==u) break;
}
}
}
void find_scc (int nn){
dfs_clock = scc_cnt = 0;
memset(sccno, 0, sizeof(sccno));
memset(pre, 0, sizeof(pre));
memset(lowlink, 0, sizeof(lowlink));
for(int i = 0; i < nn; i++){
if(!pre[i]) dfs(i);
}
}
int select (int x){
return (x>=n ? x-n : x+n);
}
int main(int argc, const char * argv[])
{
while(scanf("%d", &n)!=EOF){
scanf("%d", &m);
for(int i = 0; i < n*2; i++) g[i].clear();
for(int i = 0; i < m; i++){
int x,xx,y,yy;
scanf("%d %d %d %d", &x, &xx, &y, &yy);
int first = x + y*n;
int second = xx + yy*n;
g[first].push_back(select(second));
g[second].push_back(select(first));
}
find_scc(n*2);
int flag = 1;
for(int i = 0; i < n; i++){
if(sccno[i]==sccno[i+n]){
flag = 0;
break;
}
}
if(flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
HDU 3062 2-sat 裸题
最新推荐文章于 2020-09-02 14:23:43 发布