zoukankan      html  css  js  c++  java
  • 洛谷 P3366 【模板】最小生成树

    题目

    思路

    最小生成树
    ( ext{Prim})( ext{Kruskal})

    (Code)

    ( ext{Prim})

    /*
    Prim+链式前向星
    */
    #include<bits/stdc++.h>
    #define MAXN 5001
    #define inf 1061109567
    using namespace std;
    int n,m,cnt,ans;
    int dis[MAXN],head[MAXN];
    bool vis[MAXN];
    struct Edge{
        int next,to,w;
    }edge[200001<<1];
    inline int read(){
        int x=0;bool f=0;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return f?-x:x;
    }
    inline void addedge(int from,int to,int w){
        edge[++cnt].to=to,edge[cnt].next=head[from];
        edge[cnt].w=w,head[from]=cnt;
    }
    void Prim(){
        int tot=0,k=1;
        dis[1]=0;
        for(int i=head[1];i;i=edge[i].next){
            if(dis[edge[i].to]>edge[i].w)
                dis[edge[i].to]=edge[i].w;
        }
        while(++tot<n){
            int sum=0x7fffffff;
            vis[k]=1;
            for(int i=1;i<=n;++i){
                if(!vis[i]&&dis[i]<sum){
                    k=i;
                    sum=dis[i];
                }
            }
            ans+=sum;
            for(int i=head[k];i;i=edge[i].next){
                if(!vis[edge[i].to]&&dis[edge[i].to]>edge[i].w)
                    dis[edge[i].to]=edge[i].w;
            }
        }
    }
    
    int main(){
        memset(dis,0x3f3f3f,sizeof(dis));
        n=read(),m=read();
        int u,v,w;
        while(m--){
            u=read(),v=read(),w=read();
            addedge(u,v,w),addedge(v,u,w);
        }
        Prim();
        for(int i=1;i<=n;++i){
        	if(dis[i]==inf){
        		printf("orz
    ");
        		return 0;
        	}
        }
        printf("%d
    ",ans);
        return 0;
    }
    
    /*
    Prim+邻接矩阵
    */
    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cstdio>
    #include<algorithm>
    #define MAXN 5001
    #define inf 1061109567
    using namespace std;
    int n,m,ans;
    int map[MAXN][MAXN],dis[MAXN];
    bool vis[MAXN];
    inline int read(){
        int x=0;bool f=0;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return f?-x:x;
    }
    void Prim(){
        dis[1]=0;
        for(int i=1;i<=n;++i){
            int k=0;
            for(int j=1;j<=n;++j){
                if(!vis[j]&&dis[k]>dis[j]) k=j;
            }
            vis[k]=1;
            for(int j=1;j<=n;++j){
                if(!vis[j]&&map[k][j]<dis[j])
                    dis[j]=map[k][j];
            }
        }
    }
    
    int main(){
        memset(map,0x3f3f3f,sizeof(map));
        memset(dis,0x3f3f3f,sizeof(dis));
        n=read(),m=read();
        int u,v,w;
        for(int i=1;i<=m;++i){
            u=read(),v=read(),w=read();
            if(map[u][v]>w){
                map[u][v]=w;
                map[v][u]=w;
            }
        }
        Prim();
        for(int i=1;i<=n;++i){
            ans+=dis[i];
            if(dis[i]==inf){
            	printf("orz
    ");
            	return 0;
            }
        }
        printf("%d
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    django rest framework 去掉url尾部的斜杠
    django url 参数
    windows系统C盘显示100G已用完,全选所有的文件夹查看却只有50G?
    关于RESTful名字的含义
    tensorflow 之 tf.reshape 之 -1
    关于python cv2-1.0(ImportError: No module named cv2)
    spark元组的列表转化为字典
    python 中的list 转 array 以及 array 转 list 以及array.array numpy.array
    web 版processing显示图片
    网页版的processing
  • 原文地址:https://www.cnblogs.com/poi-bolg-poi/p/11197605.html
Copyright © 2011-2022 走看看