*最小生成树

来源:互联网 发布:淘宝卖假货封店 编辑:程序博客网 时间:2024/06/04 18:56
今天是2017/5/22,DCDCBigBig的第七篇博文

kruskal

//用并查集实现#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;struct edge{    int u,v,w;}a[10001];bool cmp(edge e1,edge e2){    return e1.w<e2.w;}int fu,fv,n,m,u,v,w,tot=0,ans=0,fa[10001];int ff(int u){    return fa[u]==u?fa[u]:ff(fa[u]);}void add(int u,int v,int w){    a[++tot].u=u;    a[tot].v=v;    a[tot].w=w;}int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++){        scanf("%d%d%d",&u,&v,&w);        add(u,v,w);    }    for(int i=1;i<=n;i++){        fa[i]=i;    }    sort(a+1,a+n+1,cmp);    for(int i=1;i<=m;i++){        fu=ff(a[i].u);        fv=ff(a[i].v);        if(fu!=fv){            ans+=a[i].w;            fa[fu]=fv;        }    }    printf("%d",ans);    return 0;}

prim

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>int n,m,u,v,w,minn,minx,ans=0,map[1001][1001],mst[100001],lc[100001];using namespace std;void prim(){    for(int i=2;i<=n;i++){        lc[i]=map[1][i];        mst[i]=1;    }    mst[1]=0;    for(int i=2;i<=n;i++){        minn=2147483647;        for(int j=2;j<=n;j++){            if(lc[j]<minn&&lc[j]!=0){                minn=lc[j];                minx=j;            }        }        ans+=minn;        lc[minx]=0;        for(int j=2;j<=n;j++){            if(map[minx][j]<lc[j]){                lc[j]=map[minx][j];                mst[j]=minx;            }        }    }}int main(){    memset(map,0x7f,sizeof(map));    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++){        scanf("%d%d%d",&u,&v,&w);        map[u][v]=w;        map[v][u]=w;    }    prim();    printf("%d",ans);    return 0;}/*6 10  1 2 6  1 3 1  1 4 5  2 3 5  2 5 3  3 4 5  3 5 6  3 6 4  4 6 2  5 6 6 */

哇第一句念完了(害怕)