因为最近在学2sat,需要学习前置技能—Tarjan算法,所以花了一天的时间学习这个算法

算法步骤:

1.从一个点开始dfs,并加入栈

2.如果下一个点没有到过,跳到第一步

3.如果下一个点到过,并且在栈中,下一个点到这个点,这一段构成一个回路,也就是可以缩点

具体实现

void dfs(int x)
{
st.push(x); //加入栈
dis[x]=1; //x点在栈中
dfn[x]=low[x]=++te; //dfn用来表示某个点访问过,并且记录初始的low值
for(int i=f[x]; i; i=nex[i])
{
int v=to[i];
if(dfn[v]==0)
{
dfs(v);
low[x]=min(low[x],low[v]); //将一个回路的low改成一样的
}
else if(dis[v]==1)low[x]=min(low[x],low[v]); //下一个点在栈中,那么找到一个回路,但是可能是嵌套回路,所以取最小low
}
if(dfn[x]==low[x]) //表示x点的初始值没有被改变,构成一个强连通分量
{
while(st.size())
{
int g=st.top();
st.pop();
dis[g]=0;
id[g]=x; //用x命名强连通分量
if(g==x)break; //代表g是强连通分量的最后一个数
}
}
}

题目:poj2186

题解:先缩点,然后构成一个新的图,找到出度为一的一个被缩过的点,返回这个点的数量,如果有1个以上被缩过的点出度为0,那么返回0

 #include <cstdio>
#include <iostream>
#include <cstring>
#include <ctime>
#include <cstdlib>
#include <vector>
#include <stack>
using namespace std;
#define ll long long
const int maxn=1e4+;
const int maxm=5e4+;
int f[maxn],nex[maxm],to[maxm],cnt,ot[maxm];
int dfn[maxn],low[maxn],id[maxn],te;
vector<int>ve;
stack<int>st;
int ma[maxn];
bool dis[maxn];
void add(int a,int b)
{
cnt++;
to[cnt]=b;
nex[cnt]=f[a];
f[a]=cnt;
ot[cnt]=a;
}
void dfs(int x)
{
st.push(x);
dis[x]=;
dfn[x]=low[x]=++te;
for(int i=f[x]; i; i=nex[i])
{
int v=to[i];
if(dfn[v]==)
{
dfs(v);
low[x]=min(low[x],low[v]);
}
else if(dis[v]==)low[x]=min(low[x],low[v]);
}
if(dfn[x]==low[x])
{
ve.push_back(x);
while(st.size())
{
int g=st.top();
st.pop();
dis[g]=;
id[g]=x;
if(g==x)break;
}
}
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=; i<=n; i++)id[i]=i;
for(int i=; i<=m; i++)
{
int a,b;
scanf("%d %d",&a,&b);
add(a,b);
}
for(int i=; i<=n; i++)
if(dfn[i]==)dfs(i);
for(int i=; i<=cnt; i++)
{
int a=id[to[i]];
int b=id[ot[i]];
if(a!=b)
ma[b]++;
}
int fla=,num=; for(int i=; i<ve.size(); i++)
{
if(ma[ve[i]]==)num++,fla=ve[i];
}
if(ve.size()==)num=,fla=ve[];
if(num==)
{
int ans=;
for(int i=; i<=n; i++)
if(id[i]==fla)ans++;
printf("%d\n",ans);
}
else
printf("0\n");
return ;
}

Tarjan算法(缩点)的更多相关文章

  1. tarjan算法+缩点--cojs 908. 校园网

    cojs 908. 校园网 ★★   输入文件:schlnet.in   输出文件:schlnet.out   简单对比时间限制:1 s   内存限制:128 MB USACO/schlnet(译 b ...

  2. tarjan算法+缩点:求强连通分量 POJ 2186

    强连通分量:1309. [HAOI2006]受欢迎的牛 ★★   输入文件:cow.in   输出文件:cow.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 每一头牛 ...

  3. POJ 1236 Network of Schools (tarjan算法+缩点)

    思路:使用tarjan求强连通分量并进行缩点,判断所有入度为0的点,这个点就是必须要给予文件的点,分别计算出度,入度为零的点的个数,取二者的最大值就是把这个图变成强连通需要加的边数. 一个取值需要讨论 ...

  4. POJ - 2553 tarjan算法+缩点

    题意: 给你n个点,和m条单向边,问你有多少点满足(G)={v∈V|∀w∈V:(v→w)⇒(w→v)}关系,并把这些点输出(要注意的是这个关系中是蕴含关系而不是且(&&)关系) 题解: ...

  5. tarjan算法(求强连通子块,缩点)

    tarjan算法求图中的强连通子图的个数. #include<iostream> #include<stack> #include<queue> #include& ...

  6. poj2186tarjan算法缩点求出度

    poj2186tarjan算法缩点求出度 自己打一遍第一题,入门啦,入门啦 题目还算简单,多头牛,给你仰慕关系(可传递),问你最后有没有牛被所有的牛仰慕 根据关系可以建图,利用tarjan算法缩点处理 ...

  7. Tarjan算法求割点

    (声明:以下图片来源于网络) Tarjan算法求出割点个数 首先来了解什么是连通图 在图论中,连通图基于连通的概念.在一个无向图 G 中,若从顶点i到顶点j有路径相连(当然从j到i也一定有路径),则称 ...

  8. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)

    Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...

  9. tarjan算法(强连通分量 + 强连通分量缩点 + 桥(割边) + 割点 + LCA)

    这篇文章是从网络上总结各方经验 以及 自己找的一些例题的算法模板,主要是用于自己的日后的模板总结以后防失忆常看看的, 写的也是自己能看懂即可. tarjan算法的功能很强大, 可以用来求解强连通分量, ...

随机推荐

  1. 网络互联技术(2)——前篇—【转载】电脑结构和CPU、内存、硬盘三者之间的关系

    原文链接:传送门 详细内容: 电脑结构和CPU.内存.硬盘三者之间的关系 前面提到了,电脑之父——冯·诺伊曼提出了计算机的五大部件:输入设备.输出设备.存储器.运算器和控制器. 我们看一下现在我们电脑 ...

  2. Python平时代码的一些知识

      os.walk的作用: def file_name(file_dir): for root, dirs, files in os.walk(file_dir): print(root) #当前目录 ...

  3. VueJs入门(一)

    VueJs学习笔记:基本概念及简单demo Vue官方介绍:简单小巧的核心,渐进式技术栈,足以应付任何规模的应用. 简单小巧指的是vue.js压缩后仅有17KB,量轻.渐进式指的是我们学习和使用vue ...

  4. 联想ts550服务器安装windows2008R2系统

    发布时间:2018-10-18 点击数:4 服务器型号:联想 thinkserver ts550 系统:windowsserver2008R2 联想的 TS550  USB口全是USB3.0的,官方引 ...

  5. 南邮ctf-web的writeup

    WEB 签到题 nctf{flag_admiaanaaaaaaaaaaa} ctrl+u或右键查看源代码即可.在CTF比赛中,代码注释.页面隐藏元素.超链接指向的其他页面.HTTP响应头部都可能隐藏f ...

  6. Linux 小知识翻译 - 「NTP」

    这周聊聊「NTP」. 上次,聊了「时区」,也就是时间相关的话题. NTP是「Network Time Protocol」的简称,是为了将网络中计算机的时钟同步到正确时间的协议. PC内部的时钟是相当不 ...

  7. 谱聚类算法(Spectral Clustering)优化与扩展

    谱聚类(Spectral Clustering, SC)在前面的博文中已经详述,是一种基于图论的聚类方法,简单形象且理论基础充分,在社交网络中广泛应用.本文将讲述进一步扩展其应用场景:首先是User- ...

  8. Django-rest-framework 接口实现 限制:(Throttle)

    限制:(Throttle) 主要用来限制 单独一个用户的 访问次数 自定义一个 限制类 创建一个Throttle.py(截流)文件 注意 一定要写两个方法 def allow_request(self ...

  9. ElasticSearch(一):CentOS7 安装 ElasticSearch6.4.0

    一.安装jre支持 在CentOS中安装ElasticSearch需要Java1.8.0,可执行命令#  java -version查看当前系统所安装Java版本是否为1.8.0版本. 若非1.8.0 ...

  10. [python] 解决pip install download速度过慢问题 更换豆瓣源

    """ python建立pip.ini.py 2016年4月30日 03:35:11 codegay """ import os ini=& ...