最小生成树 模板

来源:互联网 发布:第三方物流模式的优化 编辑:程序博客网 时间:2024/06/06 03:48
prim算法的时间复杂度
这里记顶点数v,边数e
邻接矩阵:O(v2)                 邻接表:O(elog2v)
kruskal算法的时间复杂度

elog2e  e为图中的边数(适用于边数少的)

//prim算法模板#include <iostream>#include <stdio.h>#include <cstring>using namespace std;int map[105][105],low[105],visit[105],x,y,pre[105];void prim(){    int pos,min;    memset(visit,0,sizeof(visit));    visit[1]=1;    pos=1;    for(int i=1; i<=y; i++)    {        if(i!=pos)            low[i]=map[pos][i];    }    int ans=0;    for(int i=1; i<y; i++)    {        min=100000000;        for(int j=1; j<=y; j++)        {            if(visit[j]==0&&low[j]<min)            {                min=low[j];                pos=j;            }        }        ans+=min;        visit[pos]=1;        for(int j=1; j<=y; j++)        {            if(visit[j]==0&&low[j]>map[pos][j])                low[j]=map[pos][j];        }    }    printf("%d\n",ans);    return;}int main(){    int a,b,c,w;    while(cin>>y)    {        for(int i=1; i<=y; i++)        for(int j=1; j<=y; j++)        {            scanf("%d",&w);            map[i][j]=w;        }        cin>>x;        for(int i=1; i<=x; i++)        {            scanf("%d%d",&a,&b);            map[a][b]=0;            map[b][a]=0;        }        prim();    }    return 0;}//Kruskal 模板# include<iostream># include<cstdio># include<cstring># include<algorithm>using namespace std;const int N=105;const int INF=1<<30;struct edge{    int fr,to,w,nxt;    bool operator < (const edge &a) const {        return w<a.w;    }};int pre[N],n,head[N],cnt;edge e[N*(N-1)+5];void add(int fr,int to,int w){    e[cnt].fr=fr;    e[cnt].to=to;    e[cnt].w=w;    e[cnt].nxt=head[fr];    head[fr]=cnt++;}int fin(int x){    if(x==pre[x])        return x;    return pre[x]=fin(pre[x]);}void Kruskal(){    for(int i=1;i<=n;++i)        pre[i]=i;    sort(e,e+cnt);    int ans=0;    for(int i=0;i<cnt;++i){        int u=fin(e[i].fr);        int v=fin(e[i].to);        if(u!=v){            ans+=e[i].w;            pre[u]=v;        }    }    printf("%d\n",ans);}int main(){    int a,b,c;    while(scanf("%d",&n)&&n)    {        cnt=0;        int m=n*(n-1)/2;        memset(head,-1,sizeof(head));        while(m--)        {            scanf("%d%d%d",&a,&b,&c);            add(a,b,c);            add(b,a,c);        }        Kruskal();    }    return 0;}


原创粉丝点击