代码源自:https://blog.csdn.net/whl_program/article/details/77627856
感谢!
原博主分析的也很好:
其实这是考察图的问题,删除图的一个节点,是其他节点成为连通图,至少需要添加多少条线
添加最少的路线,就是连通分量数-1(例:n个互相独立的连通分量组成一个连通图,只需要连n-1条线就可以)
这道题最重要就是求除去图的一个节点后 剩余的连通分量的数目
利用邻接矩阵v存储路线,用visit数组表示城市是否被遍历过
对于每个被占领的城市,将其表示为遍历过的状态true即可
利用深度优先遍历dfs计算连通分量数目
对于被占领的城市,简单视作为已被访问即可,甚至不需要额外的数组记录哪些城市被占领。赞!
另外,这题如果用cin输入,最后一个例子会超时。
#include<iostream>
using namespace std;
int v[1001][1001];
bool visit[1001];
int n;
void dfs(int node){
visit[node]=true;
for(int i=1;i<=n;i++)
if(visit[i]==false && v[node][i]==1)
dfs(i);
}
int main()
{
int m,k,a,b,i,j;
scanf("%d%d%d", &n, &m, &k);
for(i=0;i<m;i++)
{
scanf("%d%d", &a, &b);
v[a][b]=1;
v[b][a]=1;
}
for(i=0;i<k;i++)//依次k个城市的测试
{
fill(visit,visit+1001,false);//重置visit,所有城市未遍历
int temp=0;
scanf("%d", &temp);
visit[temp]=true;//被攻占的城市视为已访问
int cnt=0;//记录联通分量
for(j=1;j<=n;j++)
{
if(visit[j]==false)
{
dfs(j);
cnt++;
}
}
printf("%d\n", cnt-1);//cnt个连通分量可用cnt-1条路线连接成连通分量
}
return 0;
}