POJ 2762 单连通图
题意:
给你一个有向图,问你这个图是不是单连通图,单连通就是任意两点之间至少存在一条可达路径。
思路:
先强连通所点,重新建图,此时的图不存在环,然后我们在看看是否存在一条路径可以吧所有点都覆盖了就行了,直接一遍拓扑排序,只要拓扑排序唯一就行了,拓扑排序唯一的条件是 每次最多只能有一个进队。
#include<stdio.h>
#include<string.h>
#include<queue>
#include<stack>
#include<map>
#define N_node 1005
#define N_edge 6500
#define INF 1000000000
using namespace std;
typedef struct
{
int to ,next;
}STAR;
typedef struct
{
int a ,b;
}EDGE;
STAR E[N_edge] ,E1[N_edge] ,E2[N_edge];
EDGE edge[N_edge];
map<int ,map<int ,int> >mk_map;
stack<int>sk;
int list[N_node] ,list1[N_node] ,list2[N_node] ,tot;
int Belong[N_node] ,cnt;
int in[N_node] ,out[N_node];
int mark[N_node];
void add(int a ,int b)
{
E1[++tot].to = b;
E1[tot].next = list1[a];
list1[a] = tot;
E2[tot].to = a;
E2[tot].next = list2[b];
list2[b] = tot;
}
void _add(int a ,int b)
{
E[++tot].to = b;
E[tot].next = list[a];
list[a] = tot;
}
void DFS_1(int s)
{
mark[s] = 1;
for(int k = list1[s] ;k ;k = E1[k].next)
{
int xin = E1[k].to;
if(!mark[xin])
DFS_1(xin);
}
sk.push(s);
}
void DFS_2(int s)
{
mark[s] = 1;
Belong[s] = cnt;
for(int k = list2[s] ;k ;k = E2[k].next)
{
int xin = E2[k].to;
if(!mark[xin])
DFS_2(xin);
}
}
bool TP_sort(int n)
{
queue<int>q;
int ss = 0;
for(int i = 1 ;i <= n ;i ++)
{
if(in[i] == 0)
{
q.push(i);
ss ++;
if(ss > 1) return 0;
}
}
int sot = 0;
while(!q.empty())
{
int xin ,tou;
tou = q.front();
q.pop();
sot ++;
ss = 0;
for(int k = list[tou] ;k ;k = E[k].next)
{
xin = E[k].to;
if(--in[xin] == 0)
{
ss ++;
q.push(xin);
if(ss > 1) return 0;
}
}
}
return sot == n;
}
int main ()
{
int t ,n ,m;
int a ,b ,i;
scanf("%d" ,&t);
while(t--)
{
scanf("%d %d" ,&n ,&m);
memset(list1 ,0 ,sizeof(list1));
memset(list2 ,0 ,sizeof(list2));
tot = 1;
for(i = 1 ;i <= m ;i ++)
{
scanf("%d %d" ,&a ,&b);
add(a ,b);
edge[i].a = a ,edge[i].b = b;
}
memset(mark ,0 ,sizeof(mark));
while(!sk.empty())sk.pop();
for(int i = 1 ;i <= n ;i ++)
if(!mark[i]) DFS_1(i);
cnt = 0;
memset(mark ,0 ,sizeof(mark));
while(!sk.empty())
{
int xin = sk.top();
sk.pop();
if(mark[xin]) continue;
cnt ++;
DFS_2(xin);
}
mk_map.clear();
memset(in ,0 ,sizeof(in));
memset(out ,0 ,sizeof(out));
memset(list ,0 ,sizeof(list));
tot = 1;
for(i = 1 ;i <= m ;i ++)
{
a = Belong[edge[i].a];
b = Belong[edge[i].b];
if(a == b || mk_map[a][b]) continue;
mk_map[a][b] = 1;
in[b] ++ ,out[a] ++;
_add(a ,b);
}
if(TP_sort(cnt)) puts("Yes");
else puts("No");
}
return 0;
}
POJ 2762 单连通图的更多相关文章
- POJ2762 Going from u to v or from v to u?(判定单连通图:强连通分量+缩点+拓扑排序)
这道题要判断一张有向图是否是单连通图,即图中是否任意两点u和v都存在u到v或v到u的路径. 方法是,找出图中所有强连通分量,强连通分量上的点肯定也是满足单连通性的,然后对强连通分量进行缩点,缩点后就变 ...
- POJ 2762 Going from u to v or from v to u?(强连通分量+拓扑排序)
职务地址:id=2762">POJ 2762 先缩小点.进而推断网络拓扑结构是否每个号码1(排序我是想不出来这点的. .. ).由于假如有一层为2的话,那么从此之后这两个岔路的点就不可 ...
- POJ 2762 Going from u to v or from v to u? (强连通分量缩点+拓扑排序)
题目链接:http://poj.org/problem?id=2762 题意是 有t组样例,n个点m条有向边,取任意两个点u和v,问u能不能到v 或者v能不能到u,要是可以就输出Yes,否则输出No. ...
- POJ 2762 Going from u to v or from v to u?(强联通,拓扑排序)
id=2762">http://poj.org/problem?id=2762 Going from u to v or from v to u? Time Limit: 2000MS ...
- poj 2762(强连通+判断链)
题目链接:http://poj.org/problem?id=2762 思路:首先当然是要缩点建新图,由于题目要求是从u->v或从v->u连通,显然是要求单连通了,也就是要求一条长链了,最 ...
- poj 2762 Going from u to v or from v to u?(强连通分量+缩点重构图+拓扑排序)
http://poj.org/problem?id=2762 Going from u to v or from v to u? Time Limit: 2000MS Memory Limit: ...
- poj 2762(强连通分量+拓扑排序)
题目链接:http://poj.org/problem?id=2762 题意:给出一个有向图,判断任意的两个顶点(u,v)能否从u到达v,或v到达u,即单连通,输出Yes或No. 分析:对于同一个强连 ...
- POJ 2762 Going from u to v or from v to u? (判断单连通)
http://poj.org/problem?id=2762 题意:给出有向图,判断任意两个点u和v,是否可以从u到v或者从v到u. 思路: 判断图是否是单连通的. 首先来一遍强连通缩点,重新建立新图 ...
- [ tarjan + dfs ] poj 2762 Going from u to v or from v to u?
题目链接: http://poj.org/problem?id=2762 Going from u to v or from v to u? Time Limit: 2000MS Memory L ...
随机推荐
- 在不使用外延层的同轴半绝缘衬底材料上制作4H-SIC横向双重注入金属氧化物半导体场效应晶体管
在不使用外延层的同轴半绝缘衬底材料上制作4H-SIC横向双重注入金属氧化物半导体场效应晶体管 杂志:日本应用物理杂志 在不使用外延层在同轴的半绝缘SIC衬底上制作4H-SIC横向双重注入金属氧化物 ...
- .Net Core 处理跨域问题Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource
网页请求报错: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Or ...
- FreeBSD jail 折腾记(二)
FreeBSD jail 折腾记(二) 创建jail目录 创建4个 分别是模板 骨架 数据 项目 创建模板目录 mkdir -p /jail/j1 # 然后放入基本目录,上篇说过不再写 创建骨架目录 ...
- 医学图像配准 | Voxelmorph 微分同胚 | MICCAI2019
文章转载:微信公众号「机器学习炼丹术」 作者:炼丹兄(已授权) 联系方式:微信cyx645016617(欢迎交流) 论文题目:'Unsupervised Learning for Fast Proba ...
- 安卓Media相关类测试demo
最近在研究安卓系统给app开发者提供的标准Media相关的工具类,本人做了一些demo来测试这些工具的使用方法. 本demo包含若干apk源码,需要说明以下几点: 1. 构建方式 Makefile使用 ...
- Excel老式技术
Excel老式技术 VBS宏脚本嵌入明文代码
- 2019 GDUT Rating Contest I : Problem C. Mooyo Mooyo
题面: C. Mooyo Mooyo Input file: standard input Output file: standard output Time limit: 1 second Memory ...
- ASP.NET Core中间件初始化探究
前言 在日常使用ASP.NET Core开发的过程中我们多多少少会设计到使用中间件的场景,ASP.NET Core默认也为我们内置了许多的中间件,甚至有时候我们需要自定义中间件来帮我们处理一些请求管道 ...
- 前端学习 node 快速入门 系列 —— 服务端渲染
其他章节请看: 前端学习 node 快速入门 系列 服务端渲染 在简易版 Apache一文中,我们用 node 做了一个简单的服务器,能提供静态资源访问的能力. 对于真正的网站,页面中的数据应该来自服 ...
- WERTYU_键盘错位(JAVA语言)
package 第三章; import java.util.Scanner; /* * 把手放在键盘上时,稍不注意就会往右错一位.这样,输入Q会变成输入W,输入J会变成输入K等. 输 ...