Luogu P1396 营救
Posted luoshui-tianyi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P1396 营救相关的知识,希望对你有一定的参考价值。
Luogu P1396 营救
本来刚开始想用Dijkstra,但调了一半天都还有问题,所以果断放弃。
后来考虑了一下题目,发现可以考虑求最小生成树,于是开Kruskal。
果然最小生成树还是很好想的。
#include<bits/stdc++.h>
#define N 10010
#define M 20010
using namespace std;
int n,m,s,t,cnt,tot,ans;
int fa[N];
struct node {
int frm,to,val;
}edge[M];
void addEdge(int u,int v,int w) {
edge[++cnt]=(node){u,v,w};
return;
}
bool cmp(node a,node b) {
return a.val<b.val;
}
int Find(int x) {
return fa[x]==x?x:fa[x]=Find(fa[x]);
}
bool Merge(int x,int y) {
return Find(x)==Find(y)?false:true;
}
void Union(int x,int y) {
fa[Find(y)]=Find(x);
return;
}
void Read() {
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=m;i++) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addEdge(u,v,w);
}
return;
}
void Init() {
for(int i=1;i<=n;i++) {
fa[i]=i;
}
return;
}
void Kruskal() {
sort(edge+1,edge+cnt+1,cmp);
for(int i=1;i<=cnt;i++) {
if(Merge(edge[i].frm,edge[i].to)) {
Union(edge[i].frm,edge[i].to);
if(Merge(s,t)) {
ans=max(ans,edge[i].val);
}
else {
ans=max(ans,edge[i].val);
break;
}
}
}
return;
}
void Print() {
printf("%d",ans);
return;
}
int main()
{
Read();
Init();
Kruskal();
Print();
return 0;
}
以上是关于Luogu P1396 营救的主要内容,如果未能解决你的问题,请参考以下文章