程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 1269 迷宮城堡(強連通 tarjan )

hdu 1269 迷宮城堡(強連通 tarjan )

編輯:C++入門知識

hdu 1269 迷宮城堡(強連通 tarjan )


Problem Description 為了訓練小希的方向感,Gardon建立了一座大城堡,裡面有N個房間(N<=10000)和M條通道(M<=100000),每個通道都是單向的,就是說若稱某通道連通了A房間和B房間,只說明可以通過這個通道由A房間到達B房間,但並不說明通過它可以由B房間到達A房間。Gardon需要請你寫個程序確認一下是否任意兩個房間都是相互連通的,即:對於任意的i和j,至少存在一條路徑可以從房間i到房間j,也存在一條路徑可以從房間j到房間i。

Input 輸入包含多組數據,輸入的第一行有兩個數:N和M,接下來的M行每行有兩個數a和b,表示了一條通道可以從A房間來到B房間。文件最後以兩個0結束。

Output 對於輸入的每組數據,如果任意兩個房間都是相互連接的,輸出"Yes",否則輸出"No"。

Sample Input
3 3
1 2
2 3
3 1
3 3
1 2
2 3
3 2
0 0

Sample Output
Yes
No

強聯通分支為一就是強連通圖


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)

#define eps 1e-8
typedef __int64 ll;

#define FRE(i,a,b)  for(i = a; i <= b; i++)
#define mem(t, v)   memset ((t) , v, sizeof(t))
#define sf(n)       scanf("%d", &n)
#define sff(a,b)    scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf          printf
#define bug         pf("Hi\n")

using namespace std;

#define N 10005

int head[N],low[N],time[N],e_num,tim_num;
int n,m,ans,instack[N];

struct stud{
  int to,next;
}e[N*10];

stackq;

inline void add(int u,int v)
{
	e[e_num].to=v;
	e[e_num].next=head[u];
	head[u]=e_num++;
}

void tarjan(int x)
{
	int i,j;
	q.push(x);
	instack[x]=1;

	time[x]=low[x]=++tim_num;

	for(i=head[x];i!=-1;i=e[i].next)
	{
		int to=e[i].to;
		if(time[to]==0)
		{
			tarjan(to);
			if(low[x]>low[to]) low[x]=low[to];
		}
		else
			if(instack[to]&&low[x]>time[to])
				low[x]=time[to];
	}

	if(low[x]==time[x])
	{
		ans++;
		do{
			j=q.top();
			q.pop();
			instack[j]=0;
		}while(j!=x);
	}
}

void solve()
{
	int i,j;
	mem(time,0);
	mem(instack,0);

	ans=tim_num=0;
	for(i=1;i<=n;i++)
		if(time[i]==0)
		  tarjan(i);

	if(ans==1)
		printf("Yes\n");
	else
		printf("No\n");

}

int main()
{
	int i,j;
	while(scanf("%d%d",&n,&m),n+m)
	{
		int u,v;
		e_num=0;

		mem(head,-1);

		while(m--)
		{
			sff(u,v);
			add(u,v);
		}
		solve();
	}
	return 0;
}






  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved