poj Going from u to v or from v to u?

Going from u to v or from v to u?

Time Limit: 2000MS   Memory Limit: 65536K

Description

In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has n rooms, and one-way corridors connecting some rooms. Each time, Wind choose two rooms x and y, and ask one of their little sons go from one to the other. The son can either go from x to y, or from y to x. Wind promised that her tasks are all possible, but she actually doesn‘t know how to decide if a task is possible. To make her life easier, Jiajia decided to choose a cave in which every pair of rooms is a possible task. Given a cave, can you tell Jiajia whether Wind can randomly choose two rooms without worrying about anything?

Input

The first line contains a single integer T, the number of test cases. And followed T cases.

The first line for each case contains two integers n, m(0 < n < 1001,m < 6000), the number of rooms and corridors in the cave. The next m lines each contains two integers u and v, indicating that there is a corridor connecting room u and room v directly.

Output

The output should contain T lines. Write ‘Yes‘ if the cave has the property stated above, or ‘No‘ otherwise.

Sample Input

1
3 3
1 2
2 3
3 1

Sample Output

Yes

Source

POJ Monthly--2006.02.26,zgl & twb

思路:Tarjan+拓扑排序。

喜闻乐见的Code

#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 1010
#define maxm 6010
struct Edge {
	int u,v,next;
	Edge(int u=0,int v=0,int next=0):
		u(u),v(v),next(next) {}
}edge[maxm],EDGE[maxm];
int head[maxn],HEAD[maxn],rd[maxn];
int dfn[maxn],low[maxn],st[maxn],col[maxn];
int cnt,CNT,timee,top,numcolor;
bool ins[maxn],vis[maxn];
inline int input() {
	char c=getchar();int x=0,flag=1;
	for(;c<‘0‘||c>‘9‘;c=getchar())
		if(c==‘-‘) flag=-1;
	for(;c>=‘0‘&&c<=‘9‘;c=getchar())
		x=(x<<1)+(x<<3)+c-‘0‘;
	return x*flag;
}
inline void Add_edge(int u,int v,bool flag) {
	if(flag) edge[++cnt]=Edge(u,v,head[u]),head[u]=cnt;
	else EDGE[++CNT]=Edge(u,v,HEAD[u]),HEAD[u]=CNT;
	return;
}
void dfs(int now) {
	dfn[now]=low[now]=++timee;
	st[++top]=now;
	ins[now]=vis[now]=true;
	for(int i=head[now];i;i=edge[i].next) {
		int v=edge[i].v;
 		if(ins[v]) low[now]=min(low[now],dfn[v]);
		else if(!vis[v]) {
			dfs(v);
			low[now]=min(low[now],low[v]);
		}
	}
	if(dfn[now]==low[now]) {
		col[now]=++numcolor;
		while(st[top]!=now) {
			col[st[top]]=numcolor;
			ins[st[top--]]=false;
		}
		ins[now]=false;
		top--;
	}
	return;
}
inline bool topo() {
	int pos,count=0;
	for(int i=1;i<=numcolor;i++)
		if(rd[i]==0) pos=i,count++;
	if(count>1) return false;
	for(int k=1;k<=numcolor;k++) {
		count=0;
		for(int i=HEAD[pos];i;i=EDGE[i].next) {
			int v=EDGE[i].v;
			rd[v]--;
			if(rd[v]==0) pos=i,count++;
		}
		if(count>1) return false;
	}
	return true;
}
int main() {
	for(int t=input();t;t--) {
		int n=input(),m=input();
		for(int i=1;i<=n;i++) {
			ins[i]=vis[i]=false;
			head[i]=HEAD[i]=rd[i]=0;
			col[i]=dfn[i]=low[i]=st[i]=0;
		}
		cnt=CNT=top=timee=numcolor=0;
		for(int i=1;i<=m;i++) {
			int u=input(),v=input();
			Add_edge(u,v,1);
		}
		for(int i=1;i<=n;i++)
			if(!vis[i]) dfs(i);
		for(int i=1;i<=m;i++) {
			int u=edge[i].u,v=edge[i].v;
			if(col[u]!=col[v]) {
				Add_edge(col[u],col[v],0);
				rd[col[v]]++;
			}
		}
		topo()?printf("Yes\n"):printf("No\n");
	}
	return 0;
}

  

时间: 2024-11-11 02:22:51

poj Going from u to v or from v to u?的相关文章

POJ 2762 Going from u to v or from v to u?(强连通分量+拓扑排序)

职务地址:id=2762">POJ 2762 先缩小点.进而推断网络拓扑结构是否每个号码1(排序我是想不出来这点的. .. ).由于假如有一层为2的话,那么从此之后这两个岔路的点就不可能从一点到还有一点的. 代码例如以下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include

POJ 2762 Going from u to v or from v to u? (有向图求单连通性)

POJ 2762 Going from u to v or from v to u? 链接:http://poj.org/problem?id=2762 题意:为了让他们的儿子变得更勇敢些,Jiajia 和Wind 将他们带到一个大洞穴中.洞穴中有n 个房间,有一些单向的通道连接某些房间.每次,Wind 选择两个房间x 和y,要求他们的一个儿子从一个房间走到另一个房间,这个儿子可以从x 走到y,也可以从y 走到x.Wind 保证她布置的任务是可以完成的,但她确实不知道如何判断一个任务是否可以完成

POJ 2762 Going from u to v or from v to u? (判断弱连通)

http://poj.org/problem?id=2762 题意:给出有向图,判断任意两个点u和v,是否可以从u到v或者从v到u. 思路: 判断图是否是弱连通的. 首先来一遍强连通缩点,重新建立新图,接下来我们在新图中找入度为0的点,入度为0的点只能有1个,如果有多个那么这些个点肯定是不能相互到达的. 如果只有一个入度为0的点,走一遍dfs判断新图是否是单链,如果有分支,那么分支上的点肯定是不能相互到达的. 1 #include<iostream> 2 #include<algorit

[ 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 Limit: 65536K Total Submissions: 14546   Accepted: 3837 Description In order to make their sons brave, Jiajia and Wind take them to a big cave. The cav

poj 2762 Going from u to v or from v to u? (判断是否是弱联通图)

题意:给定一个有向图有m条单向边,判断是否任意两点都可达(a能到b或者b能到a或者互相可达),即求 弱联通分量. 算法: 先缩点求强连通分量.然后重新建图,判断新图是否是一条单链,即不能分叉,如果分叉了就会存在不可达的情况. 怎么判断是否是单链呢? 就是每次入度为0的点都只有一个,即每次队列里只有一个点. (    o(╯□╰)o.....好像已经是第二次用pair记录原图的点对,然后存pair的vector忘记清空导致wa来wa去! ) #include<cstdio> #include&l

[强连通分量] POJ 2762 Going from u to v or from v to u?

Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17089   Accepted: 4590 Description In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has n rooms, and one-way corridors

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: 65536K Total Submissions: 14573   Accepted: 3849 Description In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has

poj 2762 Going from u to v or from v to u?【强连通分量缩点+拓扑排序】

Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15812   Accepted: 4194 Description In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has n rooms, and one-way corridors

POJ 2762 Going from u to v or from v to u? (图论-tarjan)

Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14469   Accepted: 3801 Description In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has n rooms, and one-way corridors