记录PTA甲级以及C++部分语法知识1013*

代码源自: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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值