AtCoder Beginner Contest 235 E MST + 1(最小生成树思维)

题目连接
在这里插入图片描述
在这里插入图片描述
题目大意:
一个给定的无向图中,可能重边可能自环,但是任意两条边的边权一定不相等,询问对于给定的Q条边中,如果每次只把当前Qi 边放在图中,问该边是否会出现在该图的MST(最小生成树)中,回答yes/no

思路:
Q条边是独立的,我们可以按Q+M(最初的边集) 条边求最小生成树利用并查集,过程中如果被加入到MST集合里面的是Q集合里面的某边,对应号标记即可,否则就是no,这样子保证了最小且联通的性质

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
using ll = long long;
const int N = 5e5+5;

int n, m, q;
int fa[N];
struct edge{
    int u, v, w, id;
    bool operator<(const edge &a) const {
        return w < a.w;
    }
}e[N];
string ans[N];

int find(int x) {
    if(x == fa[x]) return x;
    return fa[x] = find(fa[x]);
}

int main()
{

    cin >> n >> m >> q;
    for(int i = 1; i <= n; i++)
        fa[i] = i;
    for(int i = 1; i <= m; i++) {
        cin >> e[i].u >> e[i].v >> e[i].w;
        e[i].id = i;
    }
    for(int i = 1; i <= q; i++) {
        cin >> e[i + m].u >> e[i + m].v >> e[i + m].w;
        e[i + m].id = i + m;
    }
    sort(e + 1, e + m + q + 1);
    for(int i = 1; i <= m + q; i++) {
        int fu = find(e[i].u), fv = find(e[i].v);
        if(fu == fv) {
            if(e[i].id > m) ans[e[i].id - m] = "No";
            continue;
        }
        if(e[i].id > m) {
            ans[e[i].id - m] = "Yes";
        } else {
            fa[fu] = fv;
        }
    }
    for(int i = 1; i <= q; i++)
        cout << ans[i] << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值