zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    beta冲刺总结
    beta冲刺第六天
    beta冲刺第四天
    beta冲刺第五天
    beta冲刺第三天
    beta冲刺第一天
    beta冲刺第二天
    beta冲刺前的准备
    【转载】Android 装载器---使用LoaderManager的回调方法
    【转载】Android之用PopupWindow实现弹出菜单
  • 原文地址:https://www.cnblogs.com/luoshui-tianyi/p/11695721.html
Copyright © 2011-2022 走看看