蕾姐讲过的例题..玩了两天后才想起来做 貌似省赛之后确实变得好懒了...再努力两天就可以去北京玩了!

顺便借这个题记录一下求强连通分量的算法

1 只需要一次dfs 依靠stack来实现的tarjan算法 每次走到一个点 马上把它压入栈中 每次对与这个点相连的点处理完毕 判断是否low[u]==dfn[u] 若是 开始退栈 直到栈顶元素等于u才退出(当栈顶元素等于u也需要pop) 每次一起退栈的点属于同一个强连通分量 储存图可以用链式前向星也可以用邻接矩阵更可以用vector 蕾姐说不会超时 我信了

2 需要两次dfs的kosara 在输入图的时候需要搞出来一个反向图以便第二次dfs使用 开始进行一次dfs 每当一个点要离开的时候就将其压入栈中 当所有的点都被遍历后 从栈顶元素开始进行反向搜索 一次搜到的点属于同一个强连通分量 其实..也需要用到栈...

需要注意的是 当使用tarjan时 dfs时如果判断dfn[v]时已经有了值 在else中需要有if条件(!id[v])

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
int n,m;
int id[10050];
int dfn[10050];
int low[10050];
int ans[10050];
int cd[10050];
int point[10050];
int num;
int cnt;
int tot;
vector<int >q[10050];
stack<int >s;
void init(){
for(int i=1;i<=n;i++)
{
id[i]=0;
dfn[i]=0;
low[i]=0;
ans[i]=0;
cd[i]=0;
point[i]=-1;
q[i].clear();
}
num=cnt=tot=0;
while(!s.empty())
s.pop();
}
void dfs(int u){
dfn[u]=low[u]=++cnt;
s.push(u);
int v;
int siz=q[u].size();
for(int i=0;i<siz;i++)
{
v=q[u][i];
if(!dfn[v])
{
dfs(v);
low[u]=min(low[u],low[v]); }
else if(!id[v])
{
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u])
{
int temp=0;
num++;
while(!s.empty())
{
int v=s.top();
s.pop();
temp++;
id[v]=num;
if(v==u)
break;
}
ans[num]=temp;
}
}
struct node
{
int v,nex;
};
node a[10050];
void add(int u,int v)
{
a[tot].v=v;
a[tot].nex=point[u];
point[u]=tot;
tot++;
}
void jt(){
for(int i=1;i<=n;i++)
{
int siz=q[i].size();
for(int k=0;k<siz;k++)
{
int v=q[i][k];
if(id[v]!=id[i])
{
cd[id[i]]++;
}
}
}
}
void did(){
int can=0;
int p=-1;
for(int i=1;i<=num;i++)
{
if(cd[i]==0)
{
can++;
p=i;
}
}
if(can==1)
{
printf("%d\n",ans[p]);
}
else
printf("0\n");
}
int main(){
while(cin>>n>>m)
{
init();
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
q[u].push_back(v);
}
for(int i=1;i<=n;i++)
{
if(!dfn[i])
dfs(i);
}
jt();
did();
}
}

  

poj 2186 tarjan求强连通分量的更多相关文章

  1. UESTC 901 方老师抢银行 --Tarjan求强连通分量

    思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...

  2. POJ 2186 Popular Cows --强连通分量

    题意:给定一个有向图,问有多少个点由任意顶点出发都能达到. 分析:首先,在一个有向无环图中,能被所有点达到点,出度一定是0. 先求出所有的强连通分支,然后把每个强连通分支收缩成一个点,重新建图,这样, ...

  3. tarjan求强连通分量+缩点+割点以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  4. Tarjan求强连通分量,缩点,割点

    Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...

  5. tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  6. HDU 1827 Summer Holiday(tarjan求强连通分量+缩点构成新图+统计入度+一点贪心思)经典缩点入门题

    Summer Holiday Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  7. CCF 高速公路 tarjan求强连通分量

    问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...

  8. UVALive 4262——Trip Planning——————【Tarjan 求强连通分量个数】

    Road Networks Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Stat ...

  9. tarjan求强连通分量(模板)

    https://www.luogu.org/problem/P2341 #include<cstdio> #include<cstring> #include<algor ...

随机推荐

  1. 部署django应用

    Autor: wangxianlong 2016/7/10 16:17:55 环境: centos 6.5 python 2.7.5 django 1.9 nginx 1.8 selinux diab ...

  2. javaScript中利用ActiveXObject来创建FileSystemObject操作文件

    注:如果用javascript读本地文件,遇到安全问题. 需在浏览器中进行设置,如下:     工具—> Internet选项->安全->自定义级别->启用“没有标识为安全的A ...

  3. linux网络编程_1

    本文属于转载,稍有改动,以利于学习. (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...

  4. struts2 <s:property/>标签的使用--输出时间格式转换

    转载地址http://hi.baidu.com/nonyi_com/blog/item/acf1b8d74b6cf63e07088bc4.html 最近在使用struts2的<s:propert ...

  5. JavaScript字符串&数字间转换

    比较操作符的操作数可以是任意类型.然而,只有数字和字符串才能真正执行边角操作,因此那些不是数字和字符串的操作数都讲进行类型转换,类型转换规则如下:      如果操作数为对象,那么对象转换为原始值:如 ...

  6. Lucene实践

    Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能. OK,大家都知道这个是一个搜索检索工具,那究竟是怎么做检索的,其实道理是 ...

  7. Laravel 4 系列入门教程(一)

    默认条件 本文默认你已经有配置完善的PHP+MySQL运行环境,懂得PHP网站运行的基础知识.跟随本教程走完一遍,你将会得到一个基础的包含登录的简单blog系统,并将学会如何使用一些强大的Larave ...

  8. laravel框架session使用教程

    laravel是一款php框架了,在使用laravel时会碰到session使用问题了,在使用过程中碰到一些问题与一些应用的例子. 用Laravel开发应用,把原有的代码copy过来,以前的代码ses ...

  9. 封装了get post方法

    function g($name, $defaultValue = "") { // php这里区分大小写,将两者都变为小写 $_GET = array_change_key_ca ...

  10. 浅谈K-SVD

    由于工作需要,最近刚刚看了一些K-SVD的介绍,这里给自己做一下小节. K-SVD我们一般是用在字典学习.稀疏编码方面,它可以认为是K-means的一种扩展,http://en.wikipedia.o ...