对于最短路径的问题,即是最小生成树的问题;建立要在n个城市之间建立通信连接网络,则联通n个城市需要n-1条路线,那么如何在节省经费的情况下建立一个通信网络。
prime算法就是构造最小生成树的算法。
(通过这次总结,希望自己对于prime算法有更深层次的了解)
#include<stdio.h>
int p[1001][1001];
int main()
{ int i,j,k,n;
int T=0,min,lowcost[1001];
while(scanf("%d",&n)&&n!=0)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&p[i][j]);
if(p[i][j]==-1) p[i][j]=9999;
}
k=1;
for(j=2;j<=n;j++)
lowcost[j]=p[k][j];
T=lowcost[k]=0;
for(i=1;i<=n-1;i++)
{
min=9999;
for(j=2;j<=n;j++)
if(lowcost[j]!=0&&lowcost[j]<min)
{
k=j;
min=lowcost[k];
}
T+=min;
lowcost[k]=0;
for(j=2;j<=n;j++)
if(lowcost[j]!=0&&p[k][j]<lowcost[j])
lowcost[j]=p[k][j];
}
printf("%d\n",T);
}
return 0;
}
输入输出样例:
标准输入:
第一行:n (n为城市数目)
第2—n+1行:p[i][1]……p[i][n] (pij为建立地点i和地点j直接连通的代价,i,j=1,2……n)
标准输出:T (建立通信网的最小代价数)
例如:(如下 280 是输出结果):