Prim(各种功能)

来源:互联网 发布:js 屏蔽运营商广告 编辑:程序博客网 时间:2024/06/07 08:24

输出边,输出最小生成树中的最大边以及初始化模板

#include<stdio.h>#define INF 0x3f3f3f3fint mp[2010][2010],dis[2010],book[2010],n;int save[2010];void prim(){    int maxx=-1;    for(int i=1;i<=n;i++)    {        dis[i]=mp[1][i];        save[i]=1;    }    book[1]=1;    int minn,u;    for(int i=1;i<=n-1;i++)    {        //经过松弛更新距离后从非数顶点中选出一个距离生成树最短的点         minn=INF;        for(int j=1;j<=n;j++)        {            if(dis[j]<minn&&book[j]==0)            {                minn=dis[j];                u=j;            }        }        book[u]=1;//u已经加入生成树,这时生成树已经发生变化         if(minn>maxx) maxx=minn;//记录最长边         printf("%d---%d:%d\n",u,save[u],minn);        //松弛,更新每个非树顶点到新的生成树的最短距离dis         for(int k=1;k<=n;k++)        {            if(mp[u][k]<dis[k]&&book[k]==0)            {                dis[k]=mp[u][k];                save[k]=u;//这时更新完的边在下次选出的点一定是这个点的最短的边             }        }    }    printf("%d\n",maxx);}int main(){    int m;    while(~scanf("%d%d",&n,&m))    {        for(int i=0;i<=n;i++)        {            book[i]=0;            save[i]=0;            dis[i]=INF;            for(int j=0;j<=n;j++)            {                if(i==j) mp[i][j]=0;                else mp[i][j]=INF;            }        }        int u,v,w;        for(int i=1;i<=m;i++)        {            scanf("%d%d%d",&u,&v,&w);            if(w<mp[u][v]) mp[u][v]=mp[v][u]=w;        }        prim();    }    return 0;}