【 UVALive - 4287】Proving Equivalences (SCC缩点)
2016-03-17 16:45
471 查看
题意:
给出N个命题,要求你证明这N个命题的等价性
比如有4个命题a,b,c,d,我们证明a<->b, b<->c,c<->d,每次证明都是双向的,因此一共用了6次推导
如果换成证明a->b,b->c,c->d,d->a,每次证明都是单向的,而只需4次就可以证明所有命题的等价性
现在给出M个命题证明,问还需要证明几个,才可以保证N个命题等价。
分析:
缩点后求DAG中入度为0和出度为0的联通块的较大值。
代码如下:
[LA4287]
2016-03-17 16:46:42
给出N个命题,要求你证明这N个命题的等价性
比如有4个命题a,b,c,d,我们证明a<->b, b<->c,c<->d,每次证明都是双向的,因此一共用了6次推导
如果换成证明a->b,b->c,c->d,d->a,每次证明都是单向的,而只需4次就可以证明所有命题的等价性
现在给出M个命题证明,问还需要证明几个,才可以保证N个命题等价。
分析:
缩点后求DAG中入度为0和出度为0的联通块的较大值。
代码如下:
#include<cstdio> #include<cstdlib> #include<cstring> #define Maxn 20010 #define Maxm 50010 int first[Maxn],dfn[Maxn],low[Maxn],sta[Maxn],scc[Maxn]; bool ru[Maxn],chu[Maxn]; int cnt,sl,cl; struct node { int x,y,next; }t[Maxm]; int mymin(int x,int y) {return x<y?x:y;} int mymax(int x,int y) {return x>y?x:y;} void ffind(int x) { dfn[x]=low[x]=++cnt; sta[++sl]=x; for(int i=first[x];i;i=t[i].next) { int y=t[i].y; if(dfn[y]==0) { ffind(y); low[x]=mymin(low[x],low[y]); } else if(scc[y]==0) low[x]=mymin(low[x],dfn[y]); } if(low[x]==dfn[x]) { cl++; while(1) { int z=sta[sl--]; scc[z]=cl; if(z==x) break; } } } int main() { int T; scanf("%d",&T); while(T--) { int i,n,m,r=0,c=0; scanf("%d%d",&n,&m); memset(first,0,sizeof(first)); memset(dfn,0,sizeof(dfn)); memset(scc,0,sizeof(scc)); cnt=0;sl=0;cl=0; for(i=1;i<=m;i++) { scanf("%d%d",&t[i].x,&t[i].y); t[i].next=first[t[i].x];first[t[i].x]=i; } for(i=1;i<=n;i++) if(dfn[i]==0) ffind(i); memset(ru,1,sizeof(ru)); memset(chu,1,sizeof(chu)); for(i=1;i<=m;i++) if(scc[t[i].x]!=scc[t[i].y]) chu[scc[t[i].x]]=0,ru[scc[t[i].y]]=0; for(i=1;i<=cl;i++) r+=ru[i],c+=chu[i]; if(cl==1) printf("0\n"); else printf("%d\n",mymax(r,c)); } return 0; }
[LA4287]
2016-03-17 16:46:42
相关文章推荐
- CF 622 A. Infinite Sequence【找无限数列中第i个数是几】
- UI设计与GUI设计的区别
- iOS --UIScrollView的学习(二)
- @Response与@Request
- UI Test自动化测试查看覆盖率注意事项
- setValue:forUndefinedKey this class is not key value coding-compliant for the key
- Script with Login & UPC & Requests vs Urllib2
- iOS7 UI兼容 导航栏按钮边框 UINavigationItem left and right padding
- 82. Remove Duplicates from Sorted List II My Submissions Question
- TableView详细解释
- iOS --UIScrollView的学习(一)
- KVC中setValuesForKeysWithDictionary 崩溃问题
- UITableView刷新某一行或某一部分,并记录做项目时的一小心得
- 为什么子线程不能做ui操作
- ant之build.xml基本属性详解
- POJ2431 运用queueq优先队列
- android之handler messagequene looper threadlocal 之间的详细解读
- uipickerview用法
- @RequestBody, @ResponseBody 注解详解(转)
- AS-->如何更高效的使用 Gradle, 快速build apk