算法学习之路|最小生成树——prime算法

摘要: 算法概述:对于一个带权的连通图,其顶点的集合 为V,边的集合为E。定义一个新的集合Vnew={空},第一步在图中任选一个顶点v加入Vnew,第二步寻找最短的边(u,v),其中u∈Vnew,v∈V-Vnew,其中v加入Vnew,循环执行第二步直到Vnew=V结束。

算法概述:对于一个带权的连通图,其顶点的集合 为V,边的集合为E。定义一个新的集合Vnew={空},第一步在图中任选一个顶点v加入Vnew,第二步寻找最短的边(u,v),其中u∈Vnew,v∈V-Vnew,其中v加入Vnew,循环执行第二步直到Vnew=V结束。

voidprime(){inti,j;intmin=INF;for(i=1;ilowcost[j])          {              min=lowcost[j];              k=j;          }      }      vnew[k]=1;for(j=1;j<=n;i++)      {if(!vnew[j]&&map[k][j]

题目大意:n个城市,知道各个城市的距离,建路将n个城市互相可达,路是直线建的,max=各个城市最长的那条路,求所有建路方案中max的最小值。

解题思路:直接prime求最小生成树

代码(已ac)

#include#include#include#defineN 510#defineINF 0x3f3f3f3fusingnamespacestd;int_map[N][N];intVnew[N];intlowcost[N];intprime(intn){inti,j;int_min;intans=-1;for(i=1;i<=n;i++)        lowcost[i]=INF;    lowcost[1]=0;memset(Vnew,0,sizeof(Vnew));for(i=1;i<=n;i++)    {intk;        _min=INF;for(j=1;j<=n;j++)        {if(!Vnew[j]&&_min>lowcost[j])            {                _min=lowcost[j];                k=j;            }        }        ans=max(ans,_min);        Vnew[k]=1;for(j=1;j<=n;j++)        {if(!Vnew[j]&&lowcost[j]>_map[k][j])            {                lowcost[j]=_map[k][j];            }        }    }returnans;}intmain(void){intT,i,j;intk;scanf("%d",&T);intn;while(T--)    {scanf("%d",&n);for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf("%d",&_map[i][j]);        k=prime(n);printf("%d\n",k);    }return0;}


版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:[email protected] 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

算法学习之路|最小生成树——prime算法_第1张图片

用云栖社区APP,舒服~

原文链接

你可能感兴趣的:(算法学习之路|最小生成树——prime算法)