日常练习16
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日常练习16相关的知识,希望对你有一定的参考价值。
这道题就是典型的2-sat 不过这题因为严格相连所以应该是无向边QAQ
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using std::min; const int M=2e3+7; int read(){ int ans=0,f=1,c=getchar(); while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();} while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();} return ans*f; } int n,k,vis[2*M]; char ch[15]; int first[2*M],cnt,ans; struct node{int from,to,next;}e[5*M]; void ins(int a,int b){e[++cnt]=(node){a,b,first[a]}; first[a]=cnt;} void insert(int a,int b){ins(a,b); ins(b,a);} int sum,ly; int dfs(int x){ if(vis[x^1]) return 0; vis[x]=1; sum++; if(x&1) ly++; for(int i=first[x];i;i=e[i].next){ int now=e[i].to; if(vis[now]) continue; if (!dfs(now)) return 0; } return 1; } void two_sat(){ memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++){ if(vis[i<<1]||vis[i<<1^1]) continue; sum=0; ly=0; if(dfs(i<<1)) ans=ans+std::max(ly,sum-ly); else return void(ans=-1); } } int main(){ freopen("science.in","r",stdin); freopen("science.out","w",stdout); while(scanf("%d",&n)==1&&n){ cnt=0; memset(first,0,sizeof(first)); for(int i=1;i<=n;i++){ scanf("%s",ch); k=read(); scanf("%s",ch); scanf("%s",ch); if(ch[0]==‘t‘){ if(k==i) continue; insert(i<<1,k<<1); insert(i<<1^1,k<<1^1); } else{ insert(i<<1,k<<1^1); insert(i<<1^1,k<<1); } } ans=0; two_sat(); if(ans>=0) printf("%d\\n",ans); else printf("Inconsistent\\n"); } return 0; }
以上是关于日常练习16的主要内容,如果未能解决你的问题,请参考以下文章
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段
Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)(代码片段