判断单向连通图(拓扑排序+tarjan缩点)
题意: 给你一个有向图,如果对于图中的任意一对点u和v都有一条从u到v的路或从v到u的路,那么就输出’Yes’,否则输出’No’.
理解:当出现两个及以上入度为0的点(有一个就可能是别人到它,有两个的话那么那两个就互相到不了,因为他们入度都为0),就必定有不满足连通性的,但是如果只是单纯判断出度入度,会将重边误算,所以应该要用拓扑排序。拓扑排序之前,应该先进行缩点。
注意:多组数据,要记得清0!!
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+;
const int M=N*N;
int to[M],t[M],head[N],hea[N],nex[M],ne[M],tot,tott;
int cnt,T,stk[N],flag[N],low[N],vis[N],top,bel[N];
queue<int >q;
int in[N];
void add1(int a,int b)
{
to[++tot]=b; nex[tot]=head[a]; head[a]=tot;
}
void add2(int a,int b)
{
t[++tott]=b; ne[tott]=hea[a]; hea[a]=tott;
}
void init()
{
top=,tot=,tott=,cnt=,T=;
memset(to,,sizeof(to));memset(t,,sizeof(t));
memset(head,,sizeof(head));memset(hea,,sizeof(hea));
memset(nex,,sizeof(nex));memset(ne,,sizeof(ne));
memset(vis,,sizeof(vis));memset(low,,sizeof(low));
memset(stk,,sizeof(stk));memset(in,,sizeof(in));
memset(flag,,sizeof(flag));
while(!q.empty()) q.pop();
}
void tarjan(int x)
{
vis[x]=low[x]=++T;
stk[++top]=x; flag[x]=;
for(int i=head[x];i;i=nex[i])
{
int v=to[i];
if(!vis[v])
{ tarjan(v); low[x]=min(low[x],low[v]); }
else if(flag[v])
low[x]=min(low[x],vis[v]);
}
if(vis[x]==low[x])
{
cnt++;
do{
flag[stk[top]]=; bel[stk[top]]=cnt;
}while(stk[top--]!=x);
}
}
void build(int u)
{
for(int i=head[u];i;i=nex[i])
if(bel[u]!=bel[to[i]])
add2(bel[u],bel[to[i]]),in[bel[to[i]]]++;//bel[to[i]]!!
}
bool topo()
{
//printf("%d\n",cnt);
for(int i=;i<=cnt;i++)
if(!in[i]) q.push(i);
while(!q.empty())
{
if(q.size()>) return false;
int u=q.front();
q.pop();
for(int i=hea[u];i;i=ne[i])
{
int v=t[i];
in[v]--;
if(!in[v]) q.push(v);
}
}
return true;
}
int main()
{
freopen("graph.in","r",stdin);
freopen("graph.out","w",stdout);
int n,m,Ti,a,b;
scanf("%d",&Ti);
while(Ti--)
{
init();
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d",&a,&b),add1(a,b);
for(int i=;i<=n;i++)
if(!vis[i])
tarjan(i);
for(int i=;i<=n;i++)
build(i);
if(!topo()) printf("No\n");
else printf("Yes\n");
} }
/*
2
3 2
1 3
2 3
3 2
1 2
2 3
*/
判断单向连通图(拓扑排序+tarjan缩点)的更多相关文章
- hdu6165(拓扑排序+tarjan缩点)
题意:就任意两个点能否到达: 解题思路:首先将图简化,比如假设图里有一个环,那么,这环内两个点肯定是能相互到达的,那么就不用考虑这环内的点了,很简单就想到用tarjan算法将环缩成一个点,然后就是判断 ...
- BZOJ 1194 [HNOI2006]潘多拉的盒子 (图论+拓扑排序+tarjan)
题面:洛谷传送门 BZOJ传送门 标签里三个算法全都是提高组的,然而..这是一道神题 我们把这道题分为两个部分解决 1.找出所有咒语机两两之间的包含关系 2.求出咒语机的最长上升序列 我们假设咒语机$ ...
- P1347 排序 (拓扑排序,tarjan)
题目 P1347 排序 解析 打开一看拓扑排序,要判环. 三种情况 有环(存在矛盾) 没环但在拓扑排序时存在有两个及以上的点入度为0(关系无法确定) 除了上两种情况(关系可确定) 本来懒了一下,直接在 ...
- 【Luogu P3387】缩点模板(强连通分量Tarjan&拓扑排序)
Luogu P3387 强连通分量的定义如下: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶 ...
- Codeforces Round #290 (Div. 2) 拓扑排序
C. Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- HUST 1103 校赛 邻接表-拓扑排序
Description N students were invited to attend a party, every student has some friends, only if someo ...
- 算法87-----DAG有向无环图的拓扑排序
一.题目:课程排表---210 课程表上有一些课,是必须有修学分的先后顺序的,必须要求在上完某些课的情况下才能上下一门.问是否有方案修完所有的课程?如果有的话请返回其中一个符合要求的路径,否则返回[] ...
- POJ2762 单向连通图(缩点+拓扑排序
Going from u to v or from v to u? Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19552 ...
- 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 787 Solved: 318[Submit][Stat ...
随机推荐
- Python3.7和数据库MySQL 8.0.12 绿色解压 安装教程(一)
首先要安装MySQL 数据库才可以继续安装图形工具SQLyog 第一步:下载解压包>> MYSQL官网地址:https://dev.mysql.com/downloads/file/?id ...
- Codeforces 977D: Divide by three, multiply by two(暴力)
题意 有nnn个无序的数,对这些数进行排列,要求ai=3×ai+1a_i=3\times a_{i+1}ai=3×ai+1或2×ai=ai+12\times a_i=a_{i+1}2×ai=ai ...
- Function program language
历史 Lambda演算为描述函数及其评估提供了理论框架.它是一种数学抽象而不是编程语言 - 但它构成了几乎所有当前函数式编程语言的基础.等效的理论公式,组合逻辑,通常被认为比lambda演算更抽象,并 ...
- maven使用utf8等
pom.xml: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncodi ...
- HDFS基本Shell命令
bin目录下: 1. hadoop fs 基本操作命令,类似linux shell 2. hadoop dfsadmin 管理命令 3. hadoop fsck (1. 检查hdfs中文件的健康 ...
- 用python来自动玩类似跳一跳的小游戏
最近春节,qq上出了一个叫穿越福城的小游戏.游戏的玩法类似挑一挑,也是通过一个个木桩.只不过把跳的过程变成了搭梯子.按的时间越长,梯子越长.梯子过长或者过短小企鹅都会掉下去,游戏失败.我的目的是用py ...
- 汇编实验一 查看CPU和内存,用机器指令和汇编语言指令编程
在装完DosBox环境之后,就可以用debug模式进行汇编指令的编程了. 实验内容: 首先用a指令进行数据的储存,然后用t命令进行调试. 可以发现ax,bx在不同的命令下发生了改变,cs的地 ...
- day05-数据类型与操作
- uclibc,eglibc,glibc,Musl-libc之间的区别和联系
转自:https://www.sohu.com/a/164202127_424963 1.Glibc glibc = GNU C Library 是GNU项(GNU Project)目,所实现的 C语 ...
- 对www.518shengmao.com站资源打包,采用vue Node.js
最近闲游时间比较多,于是想搞个网站练练手,首先选域名在godday里选了个518shengmao.com,买了个1元的阿里云服务器,接下来程序了. 采用vue+nodejs来开发的 一.NodeJs环 ...