有向图的强联通tarjan算法(判断是否为强联通模板)(hdu1269)
hdu1269
迷宫城堡
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6081 Accepted Submission(s): 2694
3 3
1 2
2 3
3 1
3 3
1 2
2 3
3 2
0 0
Yes
No
#include"stdio.h"
#include"string.h"
#include"iostream"
#include"stack"
#define M 10020
using namespace std;
stack<int>q;//定义栈
int head[M];
int use[M];//记录该点是否进栈
int dfn[M];
int low[M];
int belong[M];//Belong[i]=a;表示点i属于第a个连通分量;
int num;//记录连通分量的个数;
int index;//表示到达某点的时间,即次序;
int t,n;
struct st
{
int u,v,next;
}edge[M*20];
void init()
{
t=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v)
{
edge[t].u=u;
edge[t].v=v;
edge[t].next=head[u];
head[u]=t++;
}
void tarjan(int u)
{
int i;
dfn[u]=low[u]=++index;//注意index初始化为0,不能写成index++,
//要不第一个点的low和dfn的值会赋为0;
q.push(u);//入栈
use[u]=1;
for(i=head[u];i!=-1;i=edge[i].next)//对可以到达的点进行搜索;
{
int v=edge[i].v;
if(!dfn[v])//如果改点未被搜到过,则继续更新low
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
if(use[v])//若指向的改点在栈中更新low
{
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u])//表示找到了一个完整的强联通
{
num++;//强联通个数+1;
int vv;
do
{
vv=q.top();
q.pop();
use[vv]=0;
belong[vv]=num; }while(u!=vv);//直到vv==u,都属于第num个强联通分量
}
}
void solve()
{
index=num=0;
memset(dfn,0,sizeof(dfn));
memset(use,0,sizeof(use));
for(int i=1;i<=n;i++)//有些点可能不是在同一个连通图中
{
if(!dfn[i])
tarjan(i);
}
}
int main()
{
int i,m;
while(scanf("%d%d",&n,&m),m||n)
{
init();
for(i=0;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
}
solve();
int ans=belong[1];
int flag=0;
for(i=1;i<=n;i++)
if(belong[i]!=ans)
{
flag=1;
break;
}
if(flag)
printf("No\n");
else
printf("Yes\n");
}
}
有向图的强联通tarjan算法(判断是否为强联通模板)(hdu1269)的更多相关文章
- 有向图强连通分量的Tarjan算法
有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...
- 算法笔记_144:有向图强连通分量的Tarjan算法(Java)
目录 1 问题描述 2 解决方案 1 问题描述 引用自百度百科: 如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连 ...
- 有向图强连通分量的Tarjan算法及模板
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强联通(strongly connected),如果有向图G的每两个顶点都强联通,称有向图G是一个强联通图.非强联通图有向 ...
- 【转】有向图强连通分量的Tarjan算法
原文地址:https://www.byvoid.com/blog/scc-tarjan/ [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly con ...
- 【转载】有向图强连通分量的Tarjan算法
转载地址:https://www.byvoid.com/blog/scc-tarjan [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly conn ...
- 有向图强连通分量的Tarjan算法(转)
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
- 『图论』有向图强连通分量的Tarjan算法
在图论中,一个有向图被成为是强连通的(strongly connected)当且仅当每一对不相同结点u和v间既存在从u到v的路径也存在从v到u的路径.有向图的极大强连通子图(这里指点数极大)被称为强连 ...
- Java实现有向图强连通分量的Tarjan算法
1 问题描述 引用自百度百科: 如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.有向图的极大强连通子图,称为 ...
- 【有向图】强连通分量-Tarjan算法
好久没写博客了(都怪作业太多,绝对不是我玩的太嗨了) 所以今天要写的是一个高大上的东西:强连通 首先,是一些强连通相关的定义 //来自度娘 1.强连通图(Strongly Connected Grap ...
- [有向图的强连通分量][Tarjan算法]
https://www.byvoid.com/blog/scc-tarjan 主要思想 Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树.搜索时,把当前搜索树中未处理的 ...
随机推荐
- BarTender出现3702错误怎么办
很多时候,在我们不经意间,BarTender条码打印软件就会弹出各种错误消息,其实都是一些常见的小问题,是我们操作不当引起的,本文,小编就给大家来讲解BarTender错误消息3702的解决办法. 错 ...
- python的初始化运行了哪些?
下面的3个print一个是在模块下面,一个是函数里面,一个是类名下面(不在方法里面) 1. 运行这段代码可以发现第3行和11行可以打印出来.第7行没有打印出来.所以可以放心,函数或者方法里面就算有错误 ...
- 【原】list<T>排序
继承IComparable #region IComparable public int CompareTo(object obj) { if(obj is Sce ...
- GDAL------API
转载:http://gdal.org/java/org/gdal/gdal/gdal.html
- Images.xcassets 的简单使用
总结起来Images.xcassets 就这么几句话 (1)以下開始简单整理 进入images.xcassets 右键--->New Image Set 或者点XCode的images.xcas ...
- Cocos2dx3.0 TextField 输入中文的问题
一开始无法输入中文, 显示出来的是乱码, 修改一个函数, 下面是修改过后的代码 void GLView::onGLFWCharCallback(GLFWwindow *window, unsigned ...
- mysql的wait_timeout配置(此处处理方法是有问题的,不建议作为操作参考)
mysql数据库有一个wait_timeout的配置,默认值为28800(即8小时). 在默认配置不改变的情况下,如果连续8小时内都没有访问数据库的操作,再次访问mysql数据库的时候,mysql数据 ...
- Linux应急响应(三):挖矿病毒
0x00 前言 随着虚拟货币的疯狂炒作,利用挖矿脚本来实现流量变现,使得挖矿病毒成为不法分子利用最为频繁的攻击方式.新的挖矿攻击展现出了类似蠕虫的行为,并结合了高级攻击技术,以增加对目标服务器感染 ...
- [转]linux下释放文件内存
在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好.但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间影响性能,此时就需要执行释放内存(清理缓存)的操作了. ...
- CMake区分MSVC版本
MSVC++ 4.x _MSC_VER == 1000 MSVC++ 5.0 _MSC_VER == 1100 MSVC++ 6.0 _MSC_VER == 1200 MSVC++ 7.0 _MSC_ ...