博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[poj] 3180 the cow prom
阅读量:5377 次
发布时间:2019-06-15

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

这是一道强连通分量板子题。

我们只用输出点数大于1的强连通分量的个数!

#include
#include
#include
#define N 10010#define M 50010using namespace std;int n,m,head[N],dfn[N],low[N],cnt=1,t,sum,bel[N],num[N],out[N],ans;bool instk[N];stack
stk;struct hhh{ int to,next;}edge[M];int read(){ int ans=0,fu=1; char j=getchar(); for (;(j<'0' || j>'9') && j!='-';j=getchar()) ; if (j=='-') fu=-1,j=getchar(); for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0'; return ans*fu;}void add(int u,int v){ edge[cnt].to=v; edge[cnt].next=head[u]; head[u]=cnt++;}void Tarjan(int x){ dfn[x]=low[x]=++t; stk.push(x); instk[x]=1; int v; for (int i=head[x];i;i=edge[i].next) { v=edge[i].to; if (!dfn[v]) { Tarjan(v); low[x]=min(low[x],low[v]); } else if (instk[v]) low[x]=min(low[x],dfn[v]); } if (dfn[x]==low[x]) { sum++; do { v=stk.top(); stk.pop(); instk[v]=0; bel[v]=sum; num[sum]++; }while(v!=x); }}int main(){ n=read(); m=read(); for (int i=1,a,b;i<=m;i++) { a=read(); b=read(); add(a,b); } for (int i=1;i<=n;i++) if (!dfn[i]) Tarjan(i); for (int i=1;i<=sum;i++) if (num[i]>1) ans++; printf("%d",ans); return 0;}

转载于:https://www.cnblogs.com/mrha/p/7840713.html

你可能感兴趣的文章
nodejs 实现继承
查看>>
android闹钟(三):实现时钟功能
查看>>
2.1 容器的基本实现
查看>>
用映射的方法获取当前方法的名称
查看>>
一个值得纪念的日子
查看>>
Android 访问 Webapi 更新UI
查看>>
极角排序详解:
查看>>
数据结构之图形结构
查看>>
设计方法小总结
查看>>
Verify Preorder Serialization of a Binary Tree
查看>>
addEvent
查看>>
第三批游戏版号下发 移动安全从业者有话说
查看>>
solr 5.3 导入sqlserver数据
查看>>
springMVC第二天——高级参数绑定与其它特性
查看>>
转载:Centos升级gcc
查看>>
腾讯云的基本配置(centos 7.1)及mysql的使用
查看>>
day 46 前端基础之 BOM和 DOM
查看>>
无限分类(3种不同方案)
查看>>
Emacs Org-mode中英文字体设置
查看>>
Go 文件操作
查看>>