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 }