1451: Semiconnected

时间限制: 1 Sec  内存限制: 32 MB

提交: 79  解决: 20

题目描述

For a directed graph G = (V, E), if for all pairs of nodes u,v, u can always reach v or v can always reach u , then we call this a Semiconnected graph. Now you are given a directed
graph, you should tell us whether it is a Semiconnected graph. If it is, output “yes”, or else“no”.

输入

There are several test cases, for each test case, there are two integers in the first line, n and m n(n<=10000) ,m(m<=50000) , means that there are n nodes and m edges in this graph.
The nodes are numbered from 1 to n. Then m lines each with two integers u and v means there is an edge from u to v.

输出

For each test case, output “yes” if it is a Semiconnected graph, or else “no” instead.

样例输入

4 3
1 2
2 3
3 4
4 3
1 2
2 3
4 3

样例输出

yes
no

题意:给你一个有向图,若从图中任意两个点u,v。都有从u到v的路径,或者从v到u的路径,则该图为半连通的,是则输出yes,不是则输出no

思路:若该图符合以上情况,

1:入度为0的点多于一个,不符合。

2:对该图进行缩点后,若为半连通图,则当前的图为一条直线,统计新图中入度,出度为0的点是不是都只有一个即可。

代码如下:

#include "stdio.h"  //强连通缩点后,判断新图中入度为0,出度为0的点是否都只有一个
#include "string.h"
#include "vector"
#include "stack"
using namespace std; #define N 10005
#define M 50005 struct node
{
int x,y;
int next;
}edge[M];
int idx,head[N];
void Init(){ idx=0; memset(head,-1,sizeof(head)); }
void Add(int x,int y)
{
edge[idx].x=x; edge[idx].y=y;
edge[idx].next=head[x]; head[x]=idx++;
} int n;
int dfs_clock;
bool mark[N];
int scc_cnt;
int belong[N];
stack<int> q;
int num[N];
int low[N],dfn[N];
int MIN(int a,int b) { return a<b?a:b; } void DFS(int x)
{
int i,y;
q.push(x);
mark[x] = true;
low[x] = dfn[x] = ++dfs_clock;
for(i=head[x]; i!=-1; i=edge[i].next)
{
y=edge[i].y;
if(!dfn[y])
{
DFS(y);
low[x] = MIN(low[x],low[y]);
}
else if(mark[y])
low[x] = MIN(dfn[y],low[x]);
}
if(low[x]==dfn[x])
{
int temp;
scc_cnt++;
while(1)
{
temp = q.top();
q.pop();
belong[temp] = scc_cnt;
num[scc_cnt]++;
mark[temp] = false;
if(temp==x) break;
}
}
} int ru_du[N],chu_du[N]; void Solve(int id)
{
int i;
int x,y;
dfs_clock = scc_cnt = 0;
memset(dfn,0,sizeof(dfn));
memset(num,0,sizeof(num));
memset(belong,0,sizeof(belong));
memset(mark,false,sizeof(mark));
DFS(id);
for(i=1; i<=n; ++i)
{
if(!dfn[i])
DFS(i);
}
memset(ru_du,0,sizeof(ru_du));
memset(chu_du,0,sizeof(chu_du));
for(i=0; i<idx; ++i)
{
x = edge[i].x;
y = edge[i].y;
if(belong[x]!=belong[y])
{
chu_du[belong[x]]++;
ru_du[belong[y]]++;
}
}
int ru_0=0;
int chu_0=0;
for(i=1; i<=scc_cnt; ++i)
{
if(ru_du[i]==0)
ru_0++;
if(chu_du[i]==0)
chu_0++;
}
if(ru_0==1 && chu_0==1)
printf("yes\n");
else
printf("no\n");
} int ru[N],chu[N]; int main()
{
int i,m;
int x,y;
while(scanf("%d%d",&n,&m)!=EOF)
{
Init();
memset(ru,0,sizeof(ru));
memset(chu,0,sizeof(chu));
while(m--)
{
scanf("%d%d",&x,&y);
Add(x,y);
chu[x]++;
ru[y]++;
}
int ans=0,id=1;
for(i=1; i<=n; ++i)
{
if(ru[i]==0)
{
ans++;
id=i;
}
}
if(ans>1) { printf("no\n"); continue; }
Solve(id);
}
return 0;
}

Semiconnected--强连通缩点的更多相关文章

  1. poj2553 强连通缩点

    The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 10114   Accepted: ...

  2. hdu 4635 Strongly connected 强连通缩点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个n个点m条边的图,问在图不是强连通图的情况下,最多可以向图中添多少条边,若图为原来 ...

  3. BZOJ 1051: [HAOI2006]受欢迎的牛 强连通缩点

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1051 题解: 强连通缩点得到DAG图,将图转置一下,对入度为零的点跑dfs看看能不能访问 ...

  4. hdu 2767 Proving Equivalences 强连通缩点

    给出n个命题,m个推导,问最少添加多少条推导,能够使全部命题都能等价(两两都能互推) 既给出有向图,最少加多少边,使得原图变成强连通. 首先强连通缩点,对于新图,每一个点都至少要有一条出去的边和一条进 ...

  5. UVA - 11324 The Largest Clique 强连通缩点+记忆化dp

    题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...

  6. poj-1904(强连通缩点)

    题意:有n个王子,每个王子都有k个喜欢的女生,王子挑选喜欢的女生匹配,然后再给你n个王子最开始就定好的匹配,每个王子输出能够结合且不影响其他王子的女生匹配 解题思路:强连通缩点,每个王子与其喜欢的女生 ...

  7. NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序

    原文链接https://www.cnblogs.com/zhouzhendong/p/9258043.html 题目传送门 - 洛谷P3953 题目传送门 - Vijos P2030 题意 给定一个有 ...

  8. BZOJ1179 [Apio2009]Atm Tarjan 强连通缩点 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1179 题意概括 有一个有向图,每一个节点有一个权值,其中有一些结束点. 现在,你要从S出发,到达任 ...

  9. BZOJ1051 [HAOI2006]受欢迎的牛 Tarjan 强连通缩点

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1051 题意概括 有n只牛,有m个羡慕关系. 羡慕关系具有传递性. 如果A羡慕B,B羡慕C,那么我们 ...

  10. 强连通缩点— HDU1827

    强连通缩点以后最终形成的是一棵树 我们可以根据树的性质来看缩点以后的强连通分量图,就很好理解了 /* gyt Live up to every day */ #include<cstdio> ...

随机推荐

  1. jQuery的 delegate问题

    习惯了bind,用惯了live,就不习惯delegate了呀有木有... 支持为动态生成的标签元素绑定事件也许就live和delegate了吧,不过新版本已经不支持live了,只有delegate d ...

  2. Android开发更改应用图标无效的问题

    引子: 由于最近公司产品转战移动端,而且就要在年底前上线第一个版本,作为主工不得不立即投入到Android开发的学习中,昨天一天在家找了一些资料,看了一些视频,也试着弄了一个简单的应用. 问题: 本来 ...

  3. C#实现的18位身份证格式验证算法

    18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999<公民身份号码>中做了明确的规定. GB11643-1999<公民身份号码>为GB1164 ...

  4. mysql 5.7.15发布

    2016-09-06,mysql发布了5.7更新5.7.15,修复的bug数项目之前的版本已经大大减少,说明越来越稳定了.估计再过三四个版本,就会有很多公司开始考虑生产中使用了.

  5. Incorrect string value: '\xF0\x90\x8D\x83...' for column 通用解决方案

    mysql插入非ascii字符时报这个错的根本原因在于: 对应表的字符集无法存储要插入的字符,比如汉字插入latin1编码,某些特殊字符插入gbk或者utf8等. 检查一下实际插入的字符以及对应表或者 ...

  6. Office2016体验

    Microsoft又迎来了更新的季节.对于我来说,win10就算了,不太稳定,特别是遇到一些专业的程序,因为很多行业软件开发.测试环境都是winxp或win7等:VS2015也安上了,但还没用,一直用 ...

  7. 解决ArcGIS10.3属性表中文乱码问题

    问题描述:在10.3刚出为不久,就发现有时属性表会出现中文乱码的问题. 解决方法:在Cmd命令行中输入以下命令: reg add HKEY_CURRENT_USER\Software\ESRI\Des ...

  8. 利用Android多进程机制来分割组件

    android对于内存有一定的限制,很多手机上对内存的限制是完全不同的.我们的应用程序其实就是一个进程,这个进程是完全独立的,这个进程分配的内存是一定的,所以我们经常会遇到OOM的问题.但,你可能不知 ...

  9. 简易的可拖动的桌面悬浮窗效果Demo

    首先,我们需要知道,悬浮窗分为两种:Activity级别的悬浮窗,系统级别的悬浮窗 Activity级别的悬浮窗跟随所属Activity的生命周期而变化,而系统级别的悬浮窗则可以脱离Activity而 ...

  10. 学习Android,最简单的按钮提示文本信息

    最近都在看Android系统架构跟四大组件,刚开始自己看书看网络资料,简直就是一脸懵,今天在这里对初学者,或者自学的同学,可以跟着我来学习,Android 编码一个按钮出发事件的小案例: 当然,在此之 ...