poj 2186 Popular Cows 缩点
2015-07-11 17:15
489 查看
用强连通分量缩点之后,看一看出度为0的点有多少个,如果大于1个就输出0,否则输出这个点(连通分量里点的个数)。
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<iostream> #define maxn 11005 using namespace std; int low[maxn],dnf[maxn],que[maxn],tear,head[maxn],c[maxn],mark[maxn],size[maxn]; vector<int>g[maxn]; vector<int>gg[maxn]; void init(int n){ for(int i=1;i<=n;i++) g[i].clear(); } int cal,tot; void tarjin(int p){ dnf[p]=low[p]=cal++; int i,k; k=(int)g[p].size(); que[tear++]=p; for(i=0;i<k;i++){ int v=g[p][i]; if(!dnf[v]){ tarjin(v); low[p]=min(low[p],low[v]);//如果儿子就比较low } else if(!mark[v]){ low[p]=min(low[p],dnf[v]);//与栈里面的点进行比较,如果mark[i]有值就代表已经出栈了。 } } if(low[p]==dnf[p]){ while(tear>0){ mark[que[tear-1]]=tot; size[tot]++; if(que[tear-1]==p){ tear--; break; } tear--; } tot++; } } int in[maxn],out[maxn]; int solve(int n){ int i; tear=0; cal=1; tot=1; memset(dnf,0,sizeof(dnf)); memset(c,0,sizeof(c)); memset(mark,0,sizeof(mark)); for(i=1;i<=n;i++){ tear=0; if(!dnf[i]) tarjin(i); } memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); for(i=1;i<=n;i++){ int p=g[i].size(); for(int j=0;j<p;j++){ if(mark[i]!=mark[g[i][j]]){ out[mark[i]]++; in[mark[g[i][j]]]++; } } } int x=0,y=0; for(i=1;i<tot;i++){ if(in[i]==0) x++; if(out[i]==0) y++; } if(y>1) return 0; for(i=1;i<tot;i++){ if(out[i]==0) return size[i]; } return 0; } int main() { int i,n,m; while(cin>>n>>m){ for(i=1;i<=n;i++) g[i].clear(); for(i=1;i<=m;i++){ int a,b; scanf("%d%d",&a,&b); g[a].push_back(b); } printf("%d\n",solve(n)); } }
相关文章推荐
- ACM刷题网站
- hadoop命令——hdfs
- linux下安装node.js
- OptionMenuDemo(选项菜单)
- SNS是什么?有哪些类型的SNS网站?
- [转载]Android相关开发网站
- Linux文件系统和目录结构
- [Linux] - CentOS IP设置方法
- 【Hadoop系列】第一章:Hadoop生态系统概述以及版本演化
- shell中的点命令与source命令
- openwrt之vim
- 谈谈Linux应用程序 ABI兼容性
- 网站建设易犯的错误
- ubuntu14.04 openwrt
- Eclipse中的Web项目自动部署到Tomcat
- linux操作系统学习网站整理(100个)
- Linux系统中SAR命令说明
- linux 命令之top
- Nginx禁止其他域名访问
- MSP430推荐网站