注意到相交的點對必定要一裏一外,這樣就變成了2-SAT模型
而後我建邊的時候石樂志,實際上不須要考慮這個點對的邊是正着連仍是反着連,由於無論怎麼連,能相交的總會相交,因此直接判相交便可
而後tarjan縮點,再判是否合法便可ios
#include<iostream> #include<cstdio> using namespace std; const int N=100005; int n,m,h[N],cnt,l[N],r[N],dfn[N],low[N],tot,s[N],top,bl[N],col; bool v[N]; struct qwe { int ne,to; }e[N*50]; int read() { int r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f; } void add(int u,int v) { cnt++; e[cnt].ne=h[u]; e[cnt].to=v; h[u]=cnt; } void tarjan(int u) { dfn[u]=low[u]=++tot; v[s[++top]=u]=1; for(int i=h[u];i;i=e[i].ne) { if(!dfn[e[i].to]) { tarjan(e[i].to); low[u]=min(low[u],low[e[i].to]); } else if(v[e[i].to]) low[u]=min(low[u],dfn[e[i].to]); } if(low[u]==dfn[u]) { col++; while(s[top]!=u) { bl[s[top]]=col; v[s[top--]]=0; } bl[s[top]]=col; v[s[top--]]=0; } } int main() { n=read(),m=read(); for(int i=1;i<=m;i++) { l[i]=read()+1,r[i]=read()+1; if(l[i]>r[i]) swap(l[i],r[i]); } for(int i=1;i<=m;i++) for(int j=i+1;j<=m;j++) if((l[i]<=l[j]&&r[i]>=l[j]&&r[i]<=r[j])||(l[i]>=l[j]&&l[i]<=r[j]&&r[i]>=r[j])) add(i,j+m),add(i+m,j),add(j,i+m),add(j+m,i); for(int i=1;i<=m+m;i++) if(!dfn[i]) tarjan(i); for(int i=1;i<=m;i++) if(bl[i]==bl[i+m]) { puts("the evil panda is lying again"); return 0; } puts("panda is telling the truth..."); return 0; }