PAT.1013 Battle Over Cities - 并查集

这篇博客详细介绍了如何使用并查集解决PAT 1013题目的算法,主要讨论了如何判断城市之间的连通状态,并在环路中删除节点的影响。博主分享了优化后的路径压缩技巧,以及在处理查询时动态计算连通分量个数的方法,简化了代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PAT.1013 Battle Over Cities - 并查集

题目链接
一开始的想法是判定所有节点是否在环上,如果查询节点不在环上答案就是相连路径数-1,如果在环上就是0,对应就用删除叶子节点的算法来标记。
然后发现这样写比较麻烦,于是干脆对每次查询都用一次并查集来判断剩余连通分量的个数,答案就是删去目标节点后连通分量个数-1。

题解

把路径压缩放在getAnc函数里,同时将每个节点的初始最大祖先设为自己而非0,避免了以前用大量if的写法。

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

vector<pair<int,int>> roads;
int anc[1005];
int cityCnt,roadCnt,queryCnt,city,city1,city2,comps,anc1,anc2;

int getAnc(int a){
    if(anc[a] != a) anc[a] = getAnc(anc[a]);
    return anc[a];
}

int main(){
    cin>>cityCnt>>roadCnt>>queryCnt;
    for(int i = 0 ; i < roadCnt ; ++i){
        cin>>city1>>city2;
        roads.push_back({city1,city2});
    }
    for(int i = 0 ; i < queryCnt ; ++i){
        cin>>city;
        comps = cityCnt - 1;
        for(int j = 1 ; j <= cityCnt ; ++j) anc[j] = j;
        for(int j = 0 ; j < roadCnt ; ++j){
            city1 = roads[j].first;
            city2 = roads[j].second;
            if(city1 == city || city2 == city) continue;
            if(getAnc(city1) != getAnc(city2)){
                anc[getAnc(city2)] = getAnc(city1);
                comps--;
            }
        }
        cout<<comps-1<<endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值