vector <int> G[100]; //表示有100個頂點的圖的鄰接表ios
G[u].push_back(v); //從頂點u 向頂點v 畫邊,即在至關於建立一個二維數組G[100][i]數組
//搜索與頂點u 相鄰的頂點vspa
for( int i = 0; i < G[u].size(); i++) {code
int v = G[u][i];
blog
.......內存
}ci
只需與邊數成正比的內存空間io
(1)設u 的相鄰頂點數量爲n,那麼在調查頂點u 與頂點v 的關係時,須要消耗O(n)來搜索鄰接表。class
(2)難以有效的刪除邊stream
#include<iostream> #include<vector> #include<stack> using namespace std; static const int MAX = 100000; static const int NIL = -1; int n; vector <int> G[MAX]; int color[MAX]; //深度優先遍歷 void dfs(int r, int c) { stack <int> S; S.push(r); color[r] = c; while( !S.empty() ) { int u = S.top(); S.pop(); for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if(color[v] == NIL) { color[v] = c; S.push(v); } } } } void assignColor() { int id = 1; //設置初始值 for( int i = 0; i < n; i++ ) color[i] = NIL; //以未訪問的u爲起點進行深度優先搜索 for( int u = 0; u < n; u++ ) { if( color[u] == NIL ) dfs(u, id++); } } int main() { int s, t, m, q; // n爲用戶數(頂點數), m 爲關係個數 cin >> n >> m; //創建鄰接表 for(int i = 0; i < m; i++) { cin >> s >> t; G[s].push_back(t); G[t].push_back(s); } //深度優先遍歷,將能夠連通的頂點的color設置成同一值 assignColor(); cin >> q; for(int i = 0; i < q; i++) { cin >> s >> t; if( color[s] == color[t] ) { cout << "yes" << endl; } else { cout << "no" << endl; } } return 0; } /* 10 9 0 1 0 2 3 4 5 7 5 6 6 7 6 8 7 8 8 9 3 0 1 5 9 1 3 */