1. 程式人生 > >資料結構——圖 連通圖與連通分量

資料結構——圖 連通圖與連通分量

note: 連通是無向圖中的概念

接下來介紹兩個演算法:判斷圖的連通性與標記連通分量。

1. 判斷一個圖是否連通. Determine whether an undirected graph is connected

class Undirected : virtual public Network {
 public:
  bool Connected();
};

bool Undirected::Connect()
{// Return true iff graph is connected.
 
 int n = Vertices();
 
 // set all vertices as not reached
 int *reach = new int [n+1];
 for (int i = 1; i <= n; i++)
  reach[i] = 0;

 //mark vertices reachable from vertex 1
 DFS(1, reach, 1);

 //check if all vertices marked
 for (int i = 1; i<= n; i++)
  if (!reach[i]) return false;
 return true;
}

2.Component labeling. 標記連通分量

下面這個程式的複雜性是O(n^2); 用鄰接連結串列描述圖時,是O(n+e)

int Undirected::LabelComponents(int L[])
{// Label the components of the graph.
 //Return the number of components and set L[1:n] to represent a labeling of vertices by component.

 int n = Vertices();

 // assign all vertices to no component
 for (int i = 1; i<=n; i++)
  L[i] = 0;
 
 int label = 0; // ID of last component
 // identify components
 for (int i = 1; i <= n; i++)
 { 
  if(!L[i]){// unreached vertex
   //vertex i is in a new component
   label++;
   BFS(i, L, label);
  }// mark new component
 }
 return label;
}


相關推薦

資料結構實驗之論四:迷宮探索(判斷連通

Problem Description 有一個地下迷宮,它的通道都是直的,而通道所有交叉點(包括通道的端點)上都有一盞燈和一個開關;請問如何從某個起點開始在迷宮中點亮所有的燈並回到起點? Input 連續T組資料輸入,每組資料第一行給出三個正整數,分別表示地下迷宮的結點數N(1 &l

資料結構】點陣布隆處理器

文章目錄 1.點陣圖的實現 BitMap.h BitMap.c 2.布隆的實現 BloomFilter.h BloomFilter.c 1.點陣圖

資料結構 筆記:的定義操作

定義 -圖是由頂點集合(Vertex)及頂點間的關係集合(Edge)組成的一種資料結構 -Graph = (V,E) -V= 是頂點的有窮非空集合 -E=是頂點之間關係的有窮集合 無向邊 -頂點x和y之間的邊沒有方向,則稱該邊為無向邊 -<x,y> 與<

資料結構作業15—的遍歷最小生成樹(選擇題)

2-1給定有權無向圖如下。關於其最小生成樹,下列哪句是對的? (3分) A.邊(B, F)一定在樹中,樹的總權重為23 B.邊(H, G)一定在樹中,樹的總權重為20 C.最小生成樹唯一,其總權重為20 D.最小生成樹不唯一,其總權重為23

資料結構】點陣BitMap布隆過濾器BloomFilter

  首先先看一下下面這個騰訊的面試題:給40億個不重複的無符號整數,沒排過序。給一個無符號整數,如何快速判斷一個數是否在這40億個數中。 【騰訊】思路一:  最容易想到的解法就是遍歷所有的40多億個整數,然後一個一個判斷。但是這個需要花費的記憶體是多大呢?  大家可以去算一下

資料結構7-關於“”的生成操作的例項

程式實現用鄰接表儲存的形式建立一棵無向圖,應用深度優先搜尋的方法遍歷圖中各點,並打印出資料,程式碼如下所示: #include"stdio.h" typedef struct ArcNode{ /*單鏈表中的結點的型別*/ int adjvex; /*該邊指向的頂點在

資料結構基礎 之 的 鄰接矩陣實現鄰接表實現

【鄰接矩陣】 鄰接矩陣,就是一個反應邊與邊之間聯絡的二維陣列。這個二維陣列我們用matrix[numV][numV]表示,其中numV是頂點數。 對於無權圖 若頂點Vi和Vj之間有邊,則matrix[Vi][Vj]=1;否則matrix[Vi][Vj]=0。 對

資料結構基礎之(下):最短路徑

轉自:http://www.cnblogs.com/edisonchou/p/4691020.html   圖(下):最短路徑 圖的最重要的應用之一就是在交通運輸和通訊網路中尋找最短路徑。例如在交通網路中經常會遇到這樣的問題:兩地之間是否有公路可通;在有多條公路可通的情況下,哪

資料結構基礎之(中):最小生成樹演算法

轉自:http://www.cnblogs.com/edisonchou/p/4681602.html   圖(中):最小生成樹演算法 圖的“多對多”特性使得圖在結構設計和演算法實現上較為困難,這時就需要根據具體應用將圖轉換為不同的樹來簡化問題的求解。 一、生成樹與最小生成

資料結構基礎之(中):的遍歷演算法

轉自:http://www.cnblogs.com/edisonchou/p/4676876.html   圖(中):圖的遍歷演算法 上一篇我們瞭解了圖的基本概念、術語以及儲存結構,還對鄰接表結構進行了模擬實現。本篇我們來了解一下圖的遍歷,和樹的遍歷類似,從圖的某一頂點出發訪問

資料結構基礎之(上):的基本概念

轉自:http://www.cnblogs.com/edisonchou/p/4672188.html   圖(上):圖的基本概念 前面幾篇已經介紹了線性表和樹兩類資料結構,線性表中的元素是“一對一”的關係,樹中的元素是“一對多”的關係,本章所述的圖結構中的元素則是“多對多”的

資料結構實驗之論三:判斷可達性(SDUT 2138)(簡單DFS)

#include <bits/stdc++.h> using namespace std; int gra[1002][1005]; int vis[1002]; int n,m; void dfs(int x) { vis[x] = 1; for(int i = 1

資料結構實驗之論二:的深度遍歷(SDUT 2107)(簡單DFS)

題解:圖的深度遍歷就是順著一個最初的結點開始,把與它相鄰的結點都找到,也就是一直往下搜尋直到盡頭,然後在順次找其他的結點。 #include <bits/stdc++.h> using namespace std; int gra[200][200]; //儲存圖的大小 int

資料結構演算法題/的生成樹:Prim演算法和Kruskal

1. 生成樹 在一個任意連通圖G中,如果取它的全部頂點和一部分邊構成一個子圖G',即:V(G')=V(G)和E(G')⊆E(G) 若同時滿足邊集E(G')中的所有邊既能夠使全部頂點連通而又不形成任何迴路,則稱子圖G'是原圖G的一棵生成樹。 連通圖是n個點n-1條邊。 在圖G的一

資料結構》08-8 How Long Does It Take

題目 Given the relations of all the activities of a project, you are supposed to find the earliest completion time of the project. Input Specifi

資料結構》08-7 公路村村通

題目 現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。 輸入格式: 輸入資料包括城鎮數目正整數N(≤1000)和候選道路數目M(≤3N);隨後的M行對應M條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮

資料結構》07-6 旅遊規劃

題目 有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度、以及該公路要收取的過路費。現在需要你寫一個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。 輸入格式: 輸入說明:輸入資料的第1行給出4個正整數N、M、S

資料結構》07-4 哈利·波特的考試

題目 哈利·波特要考試了,他需要你的幫助。這門課學的是用魔咒將一種動物變成另一種動物的本事。例如將貓變成老鼠的魔咒是haha,將老鼠變成魚的魔咒是hehe等等。反方向變化的魔咒就是簡單地將原來的魔咒倒過來念,例如ahah可以將老鼠變成貓。另外,如果想把貓變成魚,可以通過念一個直接魔咒la

資料結構》06-3 六度空間

題目 “六度空間”理論又稱作“六度分隔(Six Degrees of Separation)”理論。這個理論可以通俗地闡述為:“你和任何一個陌生人之間所間隔的人不會超過六個,也就是說,最多通過五個人你就能夠認識任何一個陌生人。”如圖1所示。 圖1 六度空間示意圖 “六度空間”理論雖

信管117118李志榮資料結構實驗六---的實驗

#include<iostream> #include<string> using namespace std; template<typename T> class Graph { private: enum { zero = 0, Max = 5 }; i