题意: 给你一个有向图,如果对于图中的任意一对点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缩点)的更多相关文章

  1. hdu6165(拓扑排序+tarjan缩点)

    题意:就任意两个点能否到达: 解题思路:首先将图简化,比如假设图里有一个环,那么,这环内两个点肯定是能相互到达的,那么就不用考虑这环内的点了,很简单就想到用tarjan算法将环缩成一个点,然后就是判断 ...

  2. BZOJ 1194 [HNOI2006]潘多拉的盒子 (图论+拓扑排序+tarjan)

    题面:洛谷传送门 BZOJ传送门 标签里三个算法全都是提高组的,然而..这是一道神题 我们把这道题分为两个部分解决 1.找出所有咒语机两两之间的包含关系 2.求出咒语机的最长上升序列 我们假设咒语机$ ...

  3. P1347 排序 (拓扑排序,tarjan)

    题目 P1347 排序 解析 打开一看拓扑排序,要判环. 三种情况 有环(存在矛盾) 没环但在拓扑排序时存在有两个及以上的点入度为0(关系无法确定) 除了上两种情况(关系可确定) 本来懒了一下,直接在 ...

  4. 【Luogu P3387】缩点模板(强连通分量Tarjan&拓扑排序)

    Luogu P3387 强连通分量的定义如下: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶 ...

  5. Codeforces Round #290 (Div. 2) 拓扑排序

    C. Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  6. HUST 1103 校赛 邻接表-拓扑排序

    Description N students were invited to attend a party, every student has some friends, only if someo ...

  7. 算法87-----DAG有向无环图的拓扑排序

    一.题目:课程排表---210 课程表上有一些课,是必须有修学分的先后顺序的,必须要求在上完某些课的情况下才能上下一门.问是否有方案修完所有的课程?如果有的话请返回其中一个符合要求的路径,否则返回[] ...

  8. POJ2762 单向连通图(缩点+拓扑排序

    Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19552 ...

  9. 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP

    1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 318[Submit][Stat ...

随机推荐

  1. shell脚本-1

    http://www.runoob.com/w3cnote/shell-scripting.html filename = "/home/........."错误!不能有空格 -- ...

  2. java中数组实现的错误

    作为一个刚学java的小白 真是错误百出 下面就是一个大神会非常不屑的一个小错误 数组在初始化的时候仅仅是定义了一个数组,并未其中的内容初始化. 附上错误代码 : class student{publ ...

  3. 利用树莓派来安装opencv从而来调动摄像头工作(没有坑,超超自己试过)

    超超最近参加了学校里一位特别厉害的老师讲的课(两天,我就从一个小白然后了解了树莓派以及Arduino这些我之前都没有了解过的东西,由于结课的需要,我们需要自己设计一个创意以及完成作品)所以才有了这篇文 ...

  4. oracle 常见查询题

    查询比本部门平均薪水高的员工信息 解法一: select d.deptno,e.empno,e.ename,e.sal,d.avgsal from emp e, (select deptno,avg( ...

  5. Pytho的历史和语言介绍

    1.Python的历史 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写Python语言的编译器.Python这个名字,来自Guido ...

  6. 9. Web browser-related (网页浏览器相关 4个)

    Firefox NoScript是Firefox的插件,可以阻止JavaScript,Java,Flash和其他插件内容(允许您选择性地重新启用某些站点). 它还提供跨站点脚本保护. 这主要是为了保持 ...

  7. webpack学习笔记(五)

    1. 如果想编写一个libray的库,代码结构如下: -library -src -index.js -math.js -string.js math.js export function add(a ...

  8. python-闭包函数

    在函数编程中经常用到闭包.闭包是什么,它是怎么产生的及用来解决什么问题呢.给出字面的定义先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)(想想Erlang的外层函数传入一个 ...

  9. Jenkins 部署自动化测试脚本(15)

    自动化测试脚本开发完成以后,希望可以把脚本放在公共的环境下提供一个入口供大家一起使用,目前最好的解决方案就是需要把代码部署在Jenkins上,下面看下如何在Jenkins配合自动化测试任务: 1.首先 ...

  10. Linux文件夹文件改英文

    打开终端,在终端中输入命令: export LANG=en_US xdg-user-dirs-gtk-update 跳出对话框询问是否将目录转化为英文路径,同意并关闭. 在终端中输入命令: expor ...