HDU1269-迷宫城堡
2015-08-31 17:02
246 查看
tarjan
强联通分量模版题,流程大概明白了,算法写的很巧妙,还需要慢慢理解。
强联通分量模版题,流程大概明白了,算法写的很巧妙,还需要慢慢理解。
#include<iostream> #include<cstring> #include<cstdio> #include<math.h> #include<vector> #include<algorithm> #include<queue> #include<set> #include<string> #include<string.h> using namespace std; #define maxn 10010 int n; vector<int> g[maxn]; int Bcnt; int Top; int Index; int low[maxn],dfn[maxn]; int belong[maxn],stack[maxn]; bool instack[maxn]; void init_tarjan() { Bcnt=Top=Index=0; for(int i=1;i<=n;i++){ low[i]=dfn[i]=0; g[i].clear(); } } void tarjan(int u) { stack[Top++]=u; instack[u]=1; low[u]=dfn[u]=++Index; for(int i=0;i<g[u].size();i++){ int v=g[u][i]; if(!dfn[v]){ tarjan(v); low[u]=min(low[v],low[u]); } else if(instack[v]){ low[u]=min(low[u],dfn[v]); } } if(low[u]==dfn[u]){ ++Bcnt; int v; do{ v=stack[--Top]; instack[v]=0; belong[v]=Bcnt; }while(u!=v); } } int main() { int m; while(cin>>n>>m,n+m){ init_tarjan(); while(m--){ int x,y; scanf("%d%d",&x,&y); g[x].push_back(y); } for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(1); // for(int i=1;i<=n;i++) // printf("%d ",belong[i]); puts(Bcnt==1?"Yes":"No"); } return 0; }
相关文章推荐
- Hadoop第10周练习—Mahout部署及进行20newsgroup数据分析例子
- Mac系统常见的指令
- ARC - MRC
- 机器学习到底适合哪些人群?
- kmp
- 伸展树的删除例程
- Linux下gdb调试程序之堆栈跟踪
- 1152 -- 整除个数
- 1151 -- key数
- UIAlertView在其他页面快速显示?
- poj 3259 Wormholes
- SELinux入门教程
- Form表单基础知识和常用兼容方法笔记(二)
- IOS学习笔记 ---- 15/08/31
- Linux下使用wget下载jdk
- noip2004 津津的储蓄计划 (模拟)
- CentOS 7 下的 Firewall
- snk文件和AssemblyInfo.cs文件的作用
- 分区
- 1150 -- 寻找最大数