判断单向连通图(拓扑排序+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 ...
随机推荐
- 我的代码-unsupervised learning
# coding: utf-8 # In[1]: import pandas as pdimport numpy as npfrom sklearn import treefrom sklearn.s ...
- 构建之法 chapter1 心得
阅读完了<构建之法>第一章后,觉得我们平时使用的软件并不是自己想象中的那样简单,用的时候是觉得很方便,但从来没有考虑过一个软件的背后需要一个团队多少的付出才能换来一个获得用户频频好评的软件 ...
- 20164318 毛瀚逸-----EXP5 MSF基础应用
1. 实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如ms08_067; (成功) 1.2 一个针对浏览器的攻击, ...
- cf352E Jeff and Brackets dp+矩阵快速幂(加法+min运算)
题意大致是这样的,一共要放 m 段括号序列,每一段放 n 个括号,也就是放 n*m个括号,再每一段中的 n 个位置分别有放左括号和右括号的代价,问最终摆放出合法的括号序列的最小代价是多少. 另外保证, ...
- maya_help()验证编程过程中模块导入的情况
import rigLib reload(rigLib.base.control)spine = rigLib.base.control.Control( prefix = 'spine1') hel ...
- 005-docker启动设置环境变量
https://blog.csdn.net/wsbgmofo/article/details/79173920
- 剑指offer 5.栈和队列 用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路:1,整体思路是元素先依次进入栈1,再从栈1依次弹出到栈2,然后弹出栈2顶部的元素,整个过程 ...
- CouchBase数据库-一个较新的、发展迅速的nosql数据库技术
couchbase是一个较新的.发展迅速的nosql数据库技术.2014年,viber宣布使用couchbase替换mongodb,以适应10亿级的用户量,目前,couchbase已大量运用于生产环境 ...
- 移动端css水平垂直居中
水平垂直居中 1.margin 负值调整偏移实现 兼容性: 当前流行的使用方法. <div class="box"> <div class="conte ...
- net use远程重启服务器
在命令行工具中分别输入如下3条命令 net use \\10.10.1.100\ipc$ Password /user:Username shutdown -f -r -m \\10.10.1.1 ...