题目连接
题目大意:
一个给定的无向图中,可能重边可能自环,但是任意两条边的边权一定不相等,询问对于给定的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;
}