1013 Battle Over Cities
题目大意
本意就是求连通分量,然后输出连通分量减一
算法思想
- 根据dfs判断,需要几次dfs才能遍历完整个图
- 最后几个测试点很大,需要考虑时间和内存的限制
代码
#include<iostream>
#include<vector>
using namespace std;
vector<bool>v;
vector<vector<int>>hway;//全局变量,dfs时可以减小内存空间
void fa(vector<bool>& s)//初始化为false
{
for (int i = 0; i < s.size(); i++)
{
s[i] = false;
}
}
void dfs(int k)//深度优先遍历,用来求连通分量
{
v[k] = true;
for (int i = 0; i < hway.size(); i++)
{
if (hway[k][i] == 1 && !v[i])
{
dfs(i);
}
}
return;
}
int main()
{
int n, m, k;
int i, j;
int sum = 0;
cin >> n >> m >> k;
hway.resize(n);
vector<int>con;
v.resize(n);
for (i = 0; i < n; i++)
{
hway[i].resize(n);
}
for (i = 0; i < m; i++)
{
int a, b;
cin >> a >> b;
hway[a-1][b-1] = 1;
hway[b-1][a-1] = 1;
}
for (i = 0; i < k; i++)
{
int city;
cin >> city;
con.push_back(city-1);
}
for (i = 0; i < k; i++)//求连通分量
{
sum = 0;
fa(v);
v[con[i]] = true;
for (j = 0; j < n; j++)
{
if (!v[j])//如果还没遍历过,就遍历一次
{
sum++;
dfs(j);
}
}
cout << sum-1 << endl;
}
}