码迷,mamicode.com
首页 > 其他好文 > 详细

模板-最小生成树

时间:2018-03-04 18:07:35      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:names   oid   def   cal   next   lin   mes   swa   algorithm   

Prim

#include<cstdio>
#define MAXN 5005
#define MAXM 200005
using namespace std;

struct edge{
    int u,v,w,next;
}G[MAXM<<1];

int head[MAXN];
int vis[MAXN];
int dis[MAXN];

int N,M,tot=0;

inline void add(int u,int v,int w){
    G[++tot].u=u;G[tot].v=v;G[tot].w=w;G[tot].next=head[u];head[u]=tot;
}

int main(){
    
    scanf("%d%d",&N,&M);
    int u,v,w;
    for(register int i=1;i<=M;++i){
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);add(v,u,w); 
    }
    
    int ans = 0;
    vis[1]=1;
    int root = 1;
    for(register int i=1;i<=N;++i)dis[i]=2147483647;
    
    for(register int i=1;i<N;++i){
        
        for(register int j=head[root];j;j=G[j].next){
            if(G[j].w<dis[G[j].v])dis[G[j].v] = G[j].w;
        }
        
        int minn = 2147483637;
        for(register int j=1;j<=N;++j){
            if(vis[j]==0&&dis[j]<minn){
                minn=dis[j];
                root=j;
            }
        }
        
        ans+=dis[root];
        vis[root]=1;
    }
    
    printf("%d",ans);
    return 0;
}

Kruscal

#include <cstdio>
#include <algorithm>

using namespace std;
const int maxn=200005;

int fa[5005],u[maxn],v[maxn],w[maxn];

inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
inline void merge(int x,int y){
    int xx=find(x),yy=find(y);
    if(xx!=yy)fa[xx]=yy;
}

inline void qs(int l,int r){
    int i=l,j=r,s=w[(l+r)/2];
    do{
        while(w[i]<s)i++;
        while(w[j]>s)j--;
        if(i<=j){
            swap(u[i],u[j]);
            swap(v[i],v[j]);
            swap(w[i],w[j]);
            i++;
            j--;
        }
    }while(i<j);
    if(i<r)qs(i,r);
    if(l<j)qs(l,j);
}

int main() {
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=1;i<=m;i++)scanf("%d%d%d\n",&u[i],&v[i],&w[i]);
    qs(1,m);
    int cnt=0,ans=0;
    for(int i=1;i<=m;i++){
        if(find(u[i])!=find(v[i])){
            merge(u[i],v[i]);
            ans+=w[i];
            cnt++;
        }
        if(cnt==n-1)break;
    }
    printf("%d\n",ans);
    return 0;
}

模板-最小生成树

标签:names   oid   def   cal   next   lin   mes   swa   algorithm   

原文地址:https://www.cnblogs.com/Neworld2002/p/8505181.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!