codevs1506传话(kosaraju算法)
- - - - - - - - 一个()打成[] 看了一晚上..... /*
求强连通分量 kosaraju算法
边表存图 正反构造两个图
跑两边 分别记下入栈顺序 和每个强连通分量的具体信息
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
#define maxn 1010
#define maxx 10010
using namespace std;
int n,m,num,head1[maxn],head2[maxn],f[maxn],cnt;
int flag[maxn],ans[maxn][maxn];
stack<int>s;
struct node
{
int u,v,per;
}e1[maxx],e2[maxx];
void Input()//输入 构图 e1为正 e2为反
{
int i,x,y;
cin>>n>>m;
for(i=;i<=m;i++)
{
cin>>x>>y;
num++;
e1[num].u=x;
e1[num].v=y;
e1[num].per=head1[x];
head1[x]=num;
e2[num].u=y;
e2[num].v=x;
e2[num].per=head2[y];
head2[y]=num;
}
}
void Dfs1(int k)
{
f[k]=;
for(int p=head1[k];p;p=e1[p].per)
{
if(!f[e1[p].v])
Dfs1(e1[p].v);
}
s.push(k);//记录入栈顺序
}
void Dfs2(int k)
{
f[k]=;
ans[cnt][++ans[cnt][]]=k;//记下第cnt个强连通分量的每个点
for(int i=head2[k];i;i=e2[i].per)
if(f[e2[i].v]==)
Dfs2(e2[i].v);
if(ans[cnt][]>)flag[k]=;//如果第 cnt个强连通分量的大小>1 则x属于某个强连通分量
}
void Kosaraju()
{
memset(f,,sizeof(f));
for(int i=;i<=n;i++)//跑第一遍Dfs 每个点依次入栈
{
if(f[i]==)
Dfs1(i);
}
memset(f,,sizeof(f));
while(!s.empty())//跑第二遍Dfs 标记每个点是否属于一个强连通分量 并计算数量
{
int tmp=s.top();
s.pop();
if(f[tmp]==)
{
cnt++;//计数强连通分量
Dfs2(tmp);
}
}
}
void Printf()
{
for(int i=;i<=n;i++)
if(flag[i]==)cout<<"T"<<endl;
else cout<<"F"<<endl;
}
int main()
{
Input();
Kosaraju();
Printf();
return ;
}
codevs1506传话(kosaraju算法)的更多相关文章
- kosaraju算法求强连通分量
什么是强连通分量?在这之前先定义一个强连通性(strong connectivity)的概念:有向图中,如果一个顶点s到t有一条路径,t到s也有一条路径,即s与t互相可达,那么我们说s与t是强连通的. ...
- Kosaraju 算法检测有向图的强连通性
给定一个有向图 G = (V, E) ,对于任意一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的,则说明该图 G 是强连通的(Strong ...
- Kosaraju 算法查找强连通分支
有向图 G = (V, E) 的一个强连通分支(SCC:Strongly Connected Components)是一个最大的顶点集合 C,C 是 V 的子集,对于 C 中的每一对顶点 u 和 v, ...
- 半连通分量--Tarjan/Kosaraju算法
一个有向图称为半连通(Semi-Connected),满足:对于图中任两点u,v,存在一条u到v的有向路径或者从v到u的有向路径. 若满足,则称G’是G的一个导出子图. 若G’是G的导出子图,且G’半 ...
- Kosaraju算法---强联通分量
1.基础知识 所需结构:原图.反向图(若在原图中存在vi到vj有向边,在反向图中就变为vj到vi的有向边).标记数组(标记是否遍历过).一个栈(或记录顶点离开时间的数组). 算法描叙: :对 ...
- Kosaraju 算法
Kosaraju 算法 一.算法简介 在计算科学中,Kosaraju的算法(又称为–Sharir Kosaraju算法)是一个线性时间(linear time)算法找到的有向图的强连通分量.它利用了一 ...
- Kosaraju算法解析: 求解图的强连通分量
Kosaraju算法解析: 求解图的强连通分量 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 定义 连通分量:在无向图中,即为连 ...
- Kosaraju算法详解
Kosaraju算法是干什么的? Kosaraju算法可以计算出一个有向图的强连通分量 什么是强连通分量? 在一个有向图中如果两个结点(结点v与结点w)在同一个环中(等价于v可通过有向路径到达w,w也 ...
- 7-6-有向图强连通分量的Kosaraju算法-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第7章 图 - 有向图强连通分量的Kosaraju算法 ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严 ...
随机推荐
- ALTER TABLE 语句与 FOREIGN KEY 约束"FK_SCHEDULE_REFERENCE_POSTCONF"冲突。
主要原因是因为两个表中有数据不匹配,只要把不匹配的数据删掉就行了.
- SQL Server索引 (原理、存储)聚集索引、非聚集索引、堆
http://www.cnblogs.com/kissdodog/archive/2013/06/12/3132380.html
- matplotlib 绘图
http://blog.csdn.net/jkhere/article/details/9324823 都打一遍 5 matplotlib-绘制精美的图表 matplotlib 是python最著名的 ...
- iOS开发(Objective-C)常用库索引
code4app.com 这网站不错,收集各种 iOS App 开发可以用到的代码示例 cocoacontrols.com/ 英文版本的lib收集 objclibs.com/ 精品lib的收集网站 h ...
- 网站性能优化— WebP 全方位介绍
谈到优化网站性能时,主要目标之一就是减少要发送到浏览器的数据量(即 payload).而当前,图片通常是页面构成中最耗费流量的部分,因此降低图片的大小是一个最为有效的优化网页前端性能的办法. 有很多工 ...
- django作models的UPDATE时,注意有过滤外键的情况
就是如果要过滤的时候,存在外键,则需要取到原始字段的名称,不然就是ID. 原始名称以__(双下划线)引用. 如: def path2db(release_version, develop_versio ...
- NSUserDefaults(数据存储)
NSUserDefaults(数据存储) NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefaults是首选.下 ...
- Keil 的辅助工具和部份高级技巧
在前面的几讲中我们介绍了工程的建立方法,常用的调试方法,除此之外,Keil 还提供 了一些辅助工具如外围接口.性能分析.变量来源分析.代码作用分析等,帮助我们了解程 的性能.查找程序中的隐藏错误,快速 ...
- Linux下修改MySQL编码的方法
有时候因为编码需要修改mysql的编码,windows下修改有图文界面简单一些,linux大家就可以参考下面的方法 默认登录mysql之后可以通过SHOW VARIABLES语句查看系统变量及其值 ...
- CONCATENATION 引发的性能问题
背景是在一台11gR2的机器上,开发反映一个批处理比以前慢了3倍.经过仔细查看该SQL的执行计划,发现由于SQL中使用了or,导致CBO走出了一个非常糟糕的CONCATENATION路径. no_ex ...