【PAT】A1013. Battle Over Cities(DFS)
@(PAT)
链接:https://www.patest.cn/contests/pat-a-practise/10013
思路:
1. 题目是要我们找到一块原来的图,去掉一个点以及与之相连的道路后,还需要添加几条通路能够使新的图再次连同,很容易想到使用DFS。
2. 要注意每次调用一次DFS函数,进行一次深度查找的时候,就是找到了图的连通的一部分,最后统计图有N个连通的部分,则让整个图都连通就只需要添加N- 1条通路。
3. 注意使用DFS的递归形式的话,记录用的变量要放在main函数外面。
My AC code:
#include <iostream>
#include <vector>
using namespace std;
int n;
vector<vector<int> > mat_lost;
vector<bool> visited;
vector<vector<int> > matInit(int size) {
vector<vector<int> > mat;
vector<int> tempv;
for (int i= 0; i< size; i++) {
tempv.push_back(0);
}
for (int i= 0; i< size; i++) {
mat.push_back(tempv);
}
return mat;
}
void DFS(int start) {
visited[start]= true;
for (int i= 0; i< n; i++) {
if (!visited[i]&& mat_lost[start][i]== 1) {
DFS(i);
}
}
}
int main() {
int m, k;
scanf("%d%d%d", &n, &m, &k);
vector<vector<int> > mat= matInit(n);
for (int i= 0; i< m; i++) {
int a, b;
scanf("%d%d", &a, &b);
mat[a- 1][b- 1]= 1;
mat[b- 1][a- 1]= 1;
}
for (int i= 0; i< n; i++) {
visited.push_back(false);
}
for (int c= 0; c< k; c++) {
int lost;
scanf("%d", &lost);
lost= lost- 1;
mat_lost= matInit(n);
for (int i= 0; i< n; i++) {
for (int j= 0; j< n; j++) {
if (i!= lost&& j!= lost) {
mat_lost[i][j]= mat[i][j];
}
}
}
for (int i= 0; i< n; i++) {
visited[i]= false;
}
visited[lost]= true;
int num= 0;
for (int i= 0; i< n; i++) {
if (!visited[i]) {
DFS(i);
num++;
}
}
printf("%d\n", num- 1);
}
}
因为使用了vector表示二维数组,所以可能有点繁琐。