zoukankan      html  css  js  c++  java
  • 【最小生成树】【kruscal】【贪心】CDOJ1636 梦后楼台高锁,酒醒帘幕低垂

    首先,考虑到,我们需要找到一条路径,使它的最小边尽量大,最大边尽量小

    然后,考虑到m比较小,我们可以去寻找一个m^2或者m^2logm的算法

    考虑枚举最小边,那么我们就需要在m或者mlogm的时间内找到尽量小的最大边

    回忆最小生成树的kruskal算法,并查集+贪心加边

    应用到此题,从枚举的最小边贪心加边,当1和n属于同一个集合时停止,得出的一定是当前最小边情况下的最优解

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int fa[210];
    int find(int x){
    	return x==fa[x] ? x : fa[x]=find(fa[x]);
    }
    struct Edge{
    	int u,v,w;
    }es[1010];
    bool cmp(const Edge &a,const Edge &b){
    	return a.w<b.w;
    }
    int n,m,ans=2147483647;
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;++i){
    		scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].w);
    	}
    	sort(es+1,es+m+1,cmp);
    	for(int i=1;i<=m;++i){
    		for(int j=1;j<=n;++j){
    			fa[j]=j;
    		}
    		bool flag=0;
    		for(int j=i;j<=m;++j){
    			int U=find(es[j].u),V=find(es[j].v);
    			if(U!=V){
    				fa[U]=V;
    			}
    			if(find(1)==find(n)){
    				flag=1;
    				ans=min(ans,es[j].w-es[i].w);
    				break;
    			}
    		}
    		if(!flag){
    			break;
    		}
    	}
    	printf("%d
    ",ans);
    	return 0;
    }
  • 相关阅读:
    Mac基本操作记录
    flutter vscode+第三方安卓模拟器
    git一些基本操作
    获取点击元素的绝对位置
    windows下提交前检测操作
    VGG网络学习
    MySQL数据库中文乱码
    配深度学习环境中的小tips(tensorflow+anaconda+keras+cuda)
    Docker安装指定的anaconda
    yolov1阅读
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/6910305.html
Copyright © 2011-2022 走看看