1. 程式人生 > >hdu1269(鄰接表+dfs)

hdu1269(鄰接表+dfs)

迷宮城堡

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11191    Accepted Submission(s): 5004


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
//hdu1269(迷宮城堡&&判斷有向圖是否聯通)
//題目大意:已知有n(n<=10000)個點,M(M<=100000)個道路。每條道路都是單向的。求任意兩個點之間是否聯通?
//解題思路:由於點n的範圍較大,所以用鄰接表儲存n個點的道路情況。然後依次搜尋n各點能否
//到達剩餘的n-1個點。如果有一個不滿足,就退出迴圈。表示該有向圖不是聯通圖。否則就是。
//這裡我用的是dfs搜尋看是否某個點能否到達其餘的n-1個點。 
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,head[100010],k,flag,vis[10010],cnt;
struct node 
{
	int x,y;
	int next;
}edge[100010];
void init()                        //初始化鄰接表 
{
	k=0;
	memset(head,-1,sizeof(head));
}
void input()                   //讀取資料 
{
   init();
   int i,j,x,y;	
   for(i=0;i<m;i++)
   {
   	 scanf("%d%d",&x,&y);
   	 edge[k].x=x;
	 edge[k].y=y;
	 edge[k].next=head[x];      //建x到y的邊。 
	 head[x]=k++; 
   }
}
void dfs(int x)
{
	int v,i;
	if(cnt==n-1) return;                 //可以到達其餘的n-1個點 
	for(i=head[x];i!=-1;i=edge[i].next)
	{
		v=edge[i].y;
		if(!vis[v])
		{
			vis[v]=1;
			cnt++;                    //cnt用來記錄從某點出發所能到達的點數 
			dfs(v);
		}
	}
}
int main()
{
    int i,j;
	while(scanf("%d%d",&n,&m)&&(n|m))
	{
	   	input();
	   	flag=1;
	   	for(i=1;i<=n;i++)
	   	{
	   	   cnt=0;
	   	   memset(vis,0,sizeof(vis));
		   vis[i]=1;	             //標記i 
	   	   dfs(i);                  //搜尋i所能到達的點的個數。 
	   	   if(cnt<n-1)
	   	   {
	   	     flag=0;break;	      //有一個點到其餘各點不是n-1時,則該圖不聯通。 
		   }                     //退出迴圈 
	    }
	    if(flag==1) printf("Yes\n");
	    else        printf("No\n");
	}
	return 0;	
} 

相關推薦

hdu1269(鄰接+dfs)

迷宮城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11191    Accepted Submissi

Connected Components (鄰接dfs)

滴答滴答---題目連結  Write a program which reads relations in a SNS (Social Network Service), and judges that given pairs of users are reachable each o

[圖] 7.30 求有向圖中所有簡單迴路-鄰接-DFS

題目來源:嚴蔚敏《資料結構》C語言版本習題冊 7.30 【題目】試寫一個求有向圖G中所有簡單迴路的演算法 【測試資料】123456對應ABCDEF 【結果】 【答案】 /*-----------------------------------------

資料結構作業——圖的儲存及遍歷(鄰接矩陣、鄰接+DFS遞迴、非遞迴+BFS)

鄰接矩陣存圖 /* * @Author: WZY * @School: HPU * @Date: 2018-11-02 18:35:27 * @Last Modified by: WZY * @Last Modified time: 2018-11-0

資料結構之DFS遞迴與非遞迴遍歷鄰接存圖

學習鄰接表存圖請看:https://blog.csdn.net/HPU_FRDHR/article/details/83957240  DFS (深度優先搜尋)        深度優先搜尋演算法(英語:Depth-First-S

zcmu 2201 (dfs+鄰接

題目連結:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=2201 思路:建立四個陣列U,D,L,R,分別表示四個方位,儲存每個節點的上下左右的資訊。 然後進行深搜,查找出長度最大的節點,並記錄它的長度。 #include<ios

資料結構BFS與DFS鄰接

#include<bits/stdc++.h> #define MVNum 100 #define OK 1 #define ERROR 0 using namespace std; typedef int Status; typedef int OtherTnfo; typedef c

[圖] 7.28 找出u到v的所有路徑-鄰接(有向圖)-DFS

題目來源:嚴蔚敏《資料結構》C語言版本習題冊 7.28 【題目】已知有向圖和圖中兩個頂點u和v,試編寫演算法求有向圖中從u到v的所有簡單路徑,並以下圖為例手工執行你的演算法,畫出相應的搜尋過程圖 【測試資料】 【結果】 【答案】 /*----------

鄰接儲存圖的DFS/BFS詳解

注 :關於鄰接表的建立,輸出連結 https://blog.csdn.net/qq_42146775/article/details/84898997 理解DFS/BFS 演算法 void BFS(這個節點) { 標記這個節點 指向這個節點的第一個臨界點 while(

資料結構 圖的鄰接儲存結構及DFS/BFS遍歷

//鄰接表 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #define INF 999 using namespace std; typedef

實驗四(建圖,無向圖+鄰接矩陣(BFS,DFS(遞迴+非遞迴)),有向圖+鄰接(BFS,DFS(遞迴+非遞迴)),拓撲排序)

//Sinhaeng Hhjian #include<bits/stdc++.h> using namespace std; const int N=100; const int MAX=1000; int book[N], cnt; struct node{

【資料結構】圖的基本操作——圖的構造(鄰接矩陣,鄰接),遍歷(DFS,BFS)

鄰接矩陣實現如下: /* 主題:用鄰接矩陣實現 DFS(遞迴) 與 BFS(非遞迴) 作者:Laugh 語言:C++ ******************************************* 樣例輸出如下: 請選擇圖的型別(a - 無向圖, b - 有向圖):a 請輸入總頂點

基於鄰接矩陣和鄰接的兩種方法實現無向圖的BFS和DFS

        廣度優先搜尋(Breadth-First-Search)和深度優先搜尋(Deep-First-Search)是搜尋策略中最經常用到的兩種方法,特別常用於圖的搜尋. BFS的思想:       從一個圖的某一個頂點V0出發,首先訪問和V0相鄰的且未被訪問過的

鄰接實現--圖的深度優先遍歷DFS和廣度優先遍歷BFS

          圖論中一個基本的概念就是遍歷。就是訪問到圖的每一個頂點,同時每個頂點只訪問一次。           DFS和BFS的概念和思路網上說明的很詳細了。但是網上很多程式碼實現有缺陷,基本都沒有考慮圖不連通的情況,比如某個頂點A和其它任何一個頂點都不關聯,

鄰接實現有向圖BFS、DFS、拓撲排序

圖的大家族 常用圖的儲存結構有兩種:鄰接矩陣,鄰接表。一個數組,一個連結串列,可見覆雜的資料結構是建立在基礎結構之上的,在這裡選擇鄰接表儲存,邊比較少時省空間。 圖按照有無方向,有無權重,分為四類 無向無權:無向圖 無向有權:無向網 有向無權:有向圖

PTAL2-007 家庭房產解題報告---DFS遍歷(鄰接vector實現)

                                     L2-007 家庭房產

基於鄰接實現的DFS深度優先搜尋

上一篇文章中說道用鄰接矩陣來實現深度優先搜尋 這裡我們來談用鄰接表來實現深度優先搜尋 鄰接表如下所示: 由於java中對於指標的使用弱化  這裡我用list來模擬連結串列操作 import java.util.ArrayList; import java.util.Li

資料結構之圖(鄰接儲存,DFS和BFS遍歷)

     來看下面的一個簡單的圖,       那麼這樣的一個圖,我們應該用什麼儲存結構來儲存它呢?常用的是鄰接矩陣和鄰接表,這裡鄰接矩陣不做講解,如下所有程式碼都是以鄰接表作為儲存結構,所以這裡就只講解下鄰接表。那麼什麼是鄰接表呢?如何構造呢?       鄰接表是一

圖的鄰接的遍歷(DFS(遞迴,非遞迴),BFS,拓撲排序)

要求:對有向圖進行DFS(深度優先遍歷)、BFS(廣度優先遍歷)、拓撲排序。寫出深度優先遍歷的遞迴和非遞迴演算法。 程式碼如下: 在此非常感謝crazy_27的評論,給我指出錯誤。 #include <stdio.h> #include <stdlib.h

圖的dfs遞迴(非遞迴)遍歷和bfs遍歷(鄰接)

1.深度優先遍歷是連通圖的一種遍歷策略.其基本思想如下: 設x是當前被訪問的頂點,在對x做過訪問的標記之後,選擇一條從x出發的未檢測過的邊(x,y),若發現頂點y已經訪問過了,則重新選擇另一條從x出發的未檢測過的邊,否則沿邊(x,y)到達未曾訪問過的y,對y訪問並將其標