博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pku 2186 Popular Cows (tarjan缩点)
阅读量:7013 次
发布时间:2019-06-28

本文共 1533 字,大约阅读时间需要 5 分钟。

将所有最大连通分量缩点,然后统计缩点后每个点的出度,出度为0的肯定就是了可是这个点可能是缩出来的,所以要记录这个点真正包含的点数。如果出度为0的点大于1个说明不存在

View Code
稍微尝试了一下stl的vector和stack #include 
#include
#include
#include
#include
#define maxn 10017 using namespace std; int low[maxn],dfn[maxn],val[maxn],out[maxn]; bool instack[maxn]; int belong[maxn]; int bcnt,index; int n,m; vector
g[maxn]; stack
s; void init() { for (int i = 0; i < maxn; ++i) { g[i].clear(); low[i] = dfn[i] = belong[i] = val[i] = out[i] = 0; instack[i] = false; } index = bcnt =0; } void tarjan(int i) { int j,k; low[i] = dfn[i] = ++index; s.push(i); instack[i] = true; for (k = 0; k < g[i].size(); ++k) { j = g[i][k]; if (!dfn[j]) { tarjan(j); low[i] = min(low[i],low[j]); } else if (instack[j]) { low[i] = min(low[i],dfn[j]); } } if(low[i] == dfn[i]) { bcnt++; do { j = s.top(); s.pop(); instack[j] = false; belong[j] = bcnt; val[bcnt]++;//记录缩点后的点真正拥有的点 } while (j != i); } } void solve() { int count = 0,i,j; for (i = 1; i <= n; ++i) { if (!dfn[i]) tarjan(i); } for (i = 1; i <= n; ++i) { for (j = 0; j < g[i].size(); ++j) { int k = g[i][j]; if (belong[i] != belong[k]) out[belong[i]]++; } } int t = 0; for (i = 1; i <= bcnt; ++i) { if (!out[i]) { count++; t = i; } } if (count > 1) puts("0"); else printf("%d\n",val[t]); } int main() { //freopen("d.txt","r",stdin); int x,y,i; while (cin>>n>>m) { init(); for (i = 1; i <= m; ++i) { cin>>x>>y; g[x].push_back(y); } solve(); } return 0; }

转载地址:http://hcqtl.baihongyu.com/

你可能感兴趣的文章
解决Td内容为空时不显示边框的问题-兼容IE、firefox、chrome
查看>>
SylixOS x86中断探测(二)
查看>>
HDFS总结
查看>>
scala 中导出excel
查看>>
Zend Studio 10正式版注册破解(2013-03-20更新)
查看>>
CentOS 7 借用debian kernel 4.9
查看>>
jni
查看>>
贪婪匹配和非贪婪匹配
查看>>
精通Hyperledger之fabric环境搭建-mac版(1.1)
查看>>
.NET中的DRY和SHY原则
查看>>
Win7下安装.Net Framework 4.0报错0xc8000222
查看>>
php:统计邮件的大小方法
查看>>
python 处理图片2
查看>>
Eclipse更改保存的SVN账号密码
查看>>
python re 正则表达式学习总结
查看>>
Mysqldump参数大全
查看>>
RHCE模拟试题
查看>>
Java随记(二)
查看>>
网站性能
查看>>
MVC框架
查看>>