主要思路,利用DFS在无向图中寻找有几个连通分量! 当数据量大时, DFS耗时, 用并查集即可!
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 #define M 999999 5 #define WHITE 0 6 #define GRAY 1 7 #define BLACK 2 8 9 void DFS_visit(vector<vector<int>> &map, int v, vector<int> &used) 10 { 11 used[v] = GRAY; 12 for(int i=0; i<used.size(); ++i) 13 if(map[v][i] != M && used[i] == WHITE) 14 DFS_visit(map, i, used); 15 used[v] = BLACK; 16 } 17 18 int DFS_version(vector<vector<int>> map, int start) 19 { 20 for(int i=0; i<map.size(); ++i) 21 map[start][i]=map[i][start]=M; 22 /*断开路*/ 23 int count(0); 24 /*记录有几个连通分量*/ 25 vector<int> used(map.size(), WHITE); 26 for(int i=start; i < start+used.size(); ++i) 27 { 28 int m = i%used.size(); 29 if(used[m] == WHITE) 30 { 31 DFS_visit(map, m, used); 32 ++count; 33 } 34 } 35 return count; 36 } 37 38 int main() 39 { 40 int n,m,k; 41 while(cin>>n>>m>>k) 42 { 43 vector<int> colum(n, M); 44 vector<vector<int>> map(n, colum); 45 vector<int> check; 46 for(int i=0; i < m; ++i) 47 { 48 int j,k; cin>>j>>k; 49 map[j-1][k-1]=map[k-1][j-1]=1; 50 } 51 for(int i=0; i<k; ++i) 52 { 53 int j; cin>>j; 54 check.push_back(j-1); 55 } 56 for(int i=0; i<check.size();++i) 57 cout<<DFS_version(map, check[i])-2<<endl; 58 } 59 return 0; 60 }