题意: 给你一个有向图,如果对于图中的任意一对点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. Spring Boot相关~

    Introducing Spring Boot Spring Boot makes it easy to create stand-alone, production-grade Spring-bas ...

  2. HTTPS协议学习

    http的缺点:(其他一些未加密的协议中也存在) 通信使用明文(不加密),内容可能会被窃听 不验证通信方的身份,因此有可能遭遇伪装 无法证明报文的完整性,所以有可能已遭篡改 TCP/IP是可能被窃听的 ...

  3. jQuery登录界面的文本框焦点代码

    <script type="text/javascript"> $(function(){ $("#address").focus(function ...

  4. javascript获取某个月份的天数

    function DayNumOfMonth(Year,Month)      //例DayNumOfMonth(2017,05);{ Month--;   //月份是0~11.month=4 var ...

  5. git 入门教程

    git 入门教程之协同开发 前面我们已经介绍过远程仓库的相关概念,不过那时并没有深入探讨,只是讲解了如何创建远程仓库以及推送最新工作成果到远程仓库,实际上远程仓库对于团队协同开发很重要,不仅仅是团队协 ...

  6. ABP安装,应用及二次开发视频

    CSDN课程:http://edu.csdn.net/lecturer/944

  7. 设置table的每竖的宽度

  8. HtmlUnit学习总结

    HtmlUnit学习总结 转载 2016年09月13日 15:58:25 标签: htmlunit / 爬虫 7304 本文摘抄其他博客或者技术论坛,自己搜集整理如下: HtmlUnit学习总结 摘要 ...

  9. 2017第八届蓝桥杯C/C++语言A组

    一:题目: 标题:迷宫 X星球的一处迷宫游乐场建在某个小山坡上.它是由10x10相互连通的小房间组成的. 房间的地板上写着一个很大的字母.我们假设玩家是面朝上坡的方向站立,则:L表示走到左边的房间,R ...

  10. 交换排序-C#实现

    交换排序包括:冒泡排序和快速排序 具体代码如下: 冒泡排序: /// <summary> /// 冒泡排序 /// 稳定性:稳定 /// 时间复杂度:O(n2) /// </summ ...