标签:str like read ann nat which art pos script
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3556 Accepted Submission(s):
1173
/* 最小字典序 直接暴力枚举DFS,首先将所有的点都置为未染色,然后从第一个点开始DFS染色,我们先尝试将i染 成1(答案中的颜色),将~i染成2,然后dfs i的所有后继并染色,如果对于后继j没有染色,那么将j然 后为1,~j染成2。如果后继j已经被染成2,则说明不能选则i,如果j已经染成1,则说明可以。 那么这些后继就可以被选择。如果选择i的时候失败了,那么必定要选择~i,如果也失败,则说明无解。否则 按次序选取下一个未被染色的点。时间复杂度O(nm)。 */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 16001 using namespace std; int col[maxn],head[maxn],ans[maxn]; int a,b,n,m,num,tot,cnt; struct node { int u,v,next; }e[maxn<<2]; inline void add(int u,int v) { e[++num].u=u; e[num].v=v; e[num].next=head[u]; head[u]=num; } bool dfs(int u) { if(col[u]==1) return true; if(col[u]==2) return false; col[u]=1;col[u^1]=2;ans[cnt++]=u; for(int i=head[u];i;i=e[i].next) { int v=e[i].v; if(!dfs(v)) return false; } return true; } bool solve() { memset(col,0,sizeof col); for(int i=0;i<n;i++) { if(col[i]) continue; cnt=0; if(!dfs(i)) { for(int j=0;j<cnt;j++) { col[ans[j]]=0; col[ans[j]^1]=0; } if(!dfs(i^1))return false; } } return true; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { n<<=1;num=1; memset(head,0,sizeof head); while(m--) { scanf("%d%d",&a,&b); a--;b--; add(a,b^1);add(b,a^1); } if(solve()) { for (int i=0;i<n;i++) if(col[i]==1) printf("%d\n",i+1); } else printf("NIE\n"); } return 0; }
hdu1814Peaceful Commission(2-SAT)
标签:str like read ann nat which art pos script
原文地址:http://www.cnblogs.com/L-Memory/p/6681985.html