最小生成树(模板)

来源:互联网 发布:淘宝ifashion怎么报名 编辑:程序博客网 时间:2024/05/16 18:14
struct edges{    int u,v,w;}edge[110];int B[1000];int fine(int x){    if(x!=B[x])        B[x]=fine(B[x]);    return B[x];}int cmp(edges a,edges b){        return a.w<b.w;}void kru( ){    int ans=0,i,k=0;    for(i=1;i<=m;i++)        B[i]=i;    for(i=0;i<n;i++)    {        int xx=fine(edge[i].u);        int yy=fine(edge[i].v);        if(xx!=yy)        {            B[xx]=yy;            k++;            ans+=edge[i].w;        }    }    if(k!=m-1)printf("?\n");    else    printf("%d\n",ans);}

时间复杂度为O(mlogm+m),主要在对边的排序


void prim(){    int u,minn=inf,i,j,ans=0;    int dis[110];    int vis[110];    for(i=1;i<=n;i++)    {        dis[i]=mmap[1][i];        vis[i]=0;    }    dis[1]=0;    vis[1]=1;    for(i=0;i<n-1;i++)    {        u=0;minn=inf;        for(j=1;j<=n;j++)        {            if(!vis[j]&&dis[j]<minn)            {                minn=dis[j];                u=j;            }        }        if(u==0)return;        ans+=minn;        vis[u]=1;        for(j=1;j<=n;j++)        {            if(!vis[j]&&dis[j]>mmap[u][j])            {                dis[j]=mmap[u][j];            }        }    }    printf("%d\n",ans);}

时间和空间复杂度都是O(n^2)



0 0
原创粉丝点击