1013 Battle Over Cities

大致题意就是给出一个无向图(可能包含若干连通块),删除某个顶点和与其相连的边以后,最少需要添加多少条边,使其成为一个连通图(一个图只包含一个连通块)。

思路:

第一步,删除某个顶点V,直接置visited[V]为已被访问即可。

第二步,删除顶点后,遍历图中所有连通块,并统计个数。

第三步,添加的边数等于连通块个数减 1。

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 const int maxn = 1010;
 5 
 6 vector<int> adj[maxn]; //邻接表
 7 bool visited[maxn]; //标记顶点是否被访问过
 8 int n,m,k,c1,c2,c;
 9 
10 void DFS(int v) { //遍历连通块
11     visited[v] = true;
12     for(int i = 0; i < adj[v].size(); ++i)
13         if(visited[adj[v][i]] == false)
14             DFS(adj[v][i]);
15 }
16 
17 int DFSTrave() {//遍历图中所有连通块
18     int cnt = 0;
19     for(int i = 1; i <= n; ++i) {
20         if(visited[i] == false) {
21             cnt++;
22             DFS(i);
23         }
24     }
25     return cnt;
26 }
27 int main() {
28     cin>>n>>m>>k;
29     for(int i = 0 ; i < m; ++i) {
30         cin>>c1>>c2;
31         adj[c1].push_back(c2);
32         adj[c2].push_back(c1);
33     }
34     for(int i = 0; i < k; ++i) {
35         cin>>c;
36         fill(visited+1,visited+1+n, false);//初始化标记数组 
37         visited[c] = true; //删除某个顶点
38         printf("%d\n",DFSTrave()-1);
39     }
40     return 0;
41 }

 

posted @ 2020-03-06 20:08  tangq123  阅读(208)  评论(0编辑  收藏  举报