PAT1013

主要思路,利用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 }

 

posted @ 2013-10-04 13:05  coding_monkey  阅读(223)  评论(0编辑  收藏  举报