EVERYTHING HAPPENS FOR THE BEST!|

wnsyou

园龄:2年4个月粉丝:19关注:16

2023-05-17 21:34阅读: 17评论: 0推荐: 0

abc235_e MST + 1 题解

MST + 1

题意

给定一个 n 个点 m 条边的无向连通图,第 i 条边连接 xiyi,边权为 ci

Q 组询问,每组询问给定三个数 uiviwi,令 ei 为一条连接 uivi 的无向边,边权为 wi

对于每组询问,请你判断:对于加入这条边后的图,问其最小生成树中是否包含了这条边,如果是,输出Yes,否则输出No

保证题目给定的原图边权两两不同,保证加入的边的边权与原图中的任意一条边都不相同。

每组询问是独立的,互相不产生影响。

思路

使用克鲁斯卡尔算法。

首先这题数据范围不小,直接模拟是肯定不行的。

我们知道,克鲁斯卡尔算法是按边权从小到大排序,然后用并查集判断这条边是否有必要加入最小生成树,而每条边能否加入最小生成树中,取决于那些边权比这条边小的边

同理,每组询问中给出的边,只取决于那些原图中的边权比其小的边。

那么就可以推出一种做法:

  • 首先将每个询问给出的边和原图中的边共同记录下来。
  • 给所有边按边权从小到大排序。
  • 就像普通的最小生成树一样处理,只是那些询问中的边只需要判断、不需要加入图中

最后输出即可。

我的做法是离线做法,在线做法已经有人讲过了,详见这篇。

Code

点击查看代码
#include <iostream>
#include <algorithm>
using namespace std;
const int M = 4e5 + 10; // 记得开两倍空间
struct Node {
int x, y, z, f; // 记录每条边的边权等,f 用来记录是第几次询问的边
bool operator < (const Node &i) const {
return z < i.z;
}
} a[M];
int n, m, q, ans[M], f[M];
int Find (int x) {
return (f[x] ? f[x] = Find(f[x]) : x);
}
int main(){
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> m >> q;
for (int i = 1; i <= m; i++) {
cin >> a[i].x >> a[i].y >> a[i].z;
}
for (int i = 1; i <= q; i++) {
cin >> a[i + m].x >> a[i + m].y >> a[i + m].z; // 将所有边记录在一起
a[i + m].f = i; // 记录是第几次询问
}
sort(a + 1, a + m + q + 1);
for (int i = 1; i <= m + q; i++) {
if (a[i].f) { // 如果不是原图中的边
int l = Find(a[i].x), r = Find(a[i].y);
ans[a[i].f] = (l != r); // 只需判断,不需加入
} else { // 是原图中的边
// 克鲁斯卡尔算法
int l = Find(a[i].x), r = Find(a[i].y);
if (l != r) {
f[l] = r;
}
}
}
for (int i = 1; i <= q; i++) { // 输出
cout << (ans[i] ? "Yes" : "No") << '\n';
}
return 0;
}

本文作者:wnsyou の blog

本文链接:https://www.cnblogs.com/wnsyou-blog/p/17410396.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wnsyou  阅读(17)  评论(0编辑  收藏  举报
  1. 1 勝利への道 安藤浩和
  2. 2 Minecraft’s End Eric Fullerton
  3. 3 月光曲完整版 贝多芬 云熙音乐
  4. 4 平凡之路 (Live版) 朴树
  5. 5 Minecraft C418
  6. 6 Paradise NiziU
  7. 7 叫我,灰原哀 龙大人不喷火
  8. 8 心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
  9. 9 战 歌 此去经年
Paradise - NiziU
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : AKIRA/Bang Chan (3RACHA)/CHANGBIN (3RACHA)/HAN (3RACHA)

作曲 : Bang Chan (3RACHA)/CHANGBIN (3RACHA)/HAN (3RACHA)/VERSACHOI

编曲 : VERSACHOI/Bang Chan(3RACHA)

昔々きいた話

ふたつの虹を超えたその向こう

光り輝く泉がある

その水面(みなも)映るのは

ほんとの自分

しあわせは今 しあわせは空

Let’s fly fly & fly We fly & fly

目と目を合わせ

信じあえるよ 感じあえるさ

Let’s fly fly & fly We fly & fly

いつか

わかるだろう

君にはもう君だけの色も形も

優しさも強さもあるんだ

上手くいかなくたって

失敗ばっかりだって

ぼくはここにいるよ

I love you so much 大好きなんだ

そのままで 大好きさ Paradise

宝物はそこにあるよ 気がついてよ

世界中探しても

君は君しかいないよ

広がる楽園 繋げよう

誰も誰もが Paradise

雨が降れば ぬかるむ道 Oh yeah

道端に咲いた花に集まる蝶を

照らす太陽は全てを温め

乾いた道に雨は降る

あたりまえだけど奇跡

小さなちっぽけな今には

大きな大きな夢が詰まっているの

悔しさに泣いたって

手を差し伸べるから

ぼくはここにいるから

I love you so much 大好きなんだ

そのままで 大好きさ Paradise

宝物は君なんだよ 気がついてよ

この惑星(ほし)の歴史にも

君は君しかいないよ

目に見えないけど確かに

ひとりひとりの Paradise

しあわせは今 しあわせは空

Let’s fly fly & fly We fly & fly

目と目を合わせ

信じあえるよ 感じあえる

だから大丈夫

心のまま行こう Paradise

加载中…

{{tag.name}}

{{tran.text}}{{tran.sub}}
无对应文字
有可能是
{{input}}
尚未录入,我来提交对应文字
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示