HDU 1269(Tarjan模板)


HDU - 1269
Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u

            

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
 

Hint

Source

HDU 2006-4 Programming Contest

題意: 求所有房間是否連通,即判斷是否只有一個強連通分量。
Tarjan算法= =
AC代碼 :
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 10000+10
#define maxm 100000+10
int n, m;
struct Edge
{
   int to,next;
}edge[maxm];
int head[maxn],tot;
int low[maxn],dfn[maxn],Stack[maxn],belong[maxn];
int index,top;
int scc; //強連通分量數量
bool instack[maxn];
void addedge(int u,int v)
{
  edge[tot].to = v;
  edge[tot].next = head[u];
  head[u] = tot++;
}
void tarjan(int u)
{
  int v;
  low[u] = dfn[u] = ++index;
  Stack[top++] = u;
  instack[u] = true;
  for(int i = head[u]; i != -1; i = edge[i].next)
  {
	v = edge[i].to;
    if(!dfn[v])
	{
	  tarjan(v);
	  if(low[v] < low[u])
	  low[u] = low[v];
	}
	else
	{
	  if(instack[v] && dfn[v] < low[u])
	  {
	    low[u] = dfn[v];
	  }
    }
  }
  if(dfn[u] == low[u])
  {
   scc ++;
   do
   {
     v= Stack[--top];
     instack[v] = false;
     belong[v] = scc;
   }
   while(v != u);
  }
}
void solve()
{
  memset(low, 0, sizeof(low));
  memset(dfn, 0, sizeof(dfn));
  memset(instack, false, sizeof(instack));
  scc = tot = index = 0;
  for(int i = 1;i <= n;i ++)
  {
    if(dfn[i] == 0)
	tarjan(i);
  }
}
int main()
{
    while(scanf("%d%d", &n, &m) != EOF)
	{
	  int x, y;
	  memset(head, -1, sizeof(head));
	  if(n+m == 0) break;
	  while(m --)
	  {
	   scanf("%d%d", &x, &y);
	   addedge(x, y);
	  }
      solve();
      if(scc == 1)
	  printf("Yes\n");
	  else
	  printf("No\n");
	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章