来源:https://blog.csdn.net/lttree/article/details/27089981
题目描述
有个城市叫做H市。其中有很多个村庄,村庄之间通信基本靠吼,交通基本靠走,很不方便。
这个市长知道了这个情况,为了替市民着想,决定修建高铁。每修建一米花费1美元。
现在市长请了最著名的工程师来修建高铁,自然这个工程师会让修建高铁的费用最少。
不幸的是,在修建了高铁之后就病逝了。现在市长希望知道在修建完成的这些高铁路中最长的一段高铁路花费了多少美元, 他请你来帮助他。
这个市长知道了这个情况,为了替市民着想,决定修建高铁。每修建一米花费1美元。
现在市长请了最著名的工程师来修建高铁,自然这个工程师会让修建高铁的费用最少。
不幸的是,在修建了高铁之后就病逝了。现在市长希望知道在修建完成的这些高铁路中最长的一段高铁路花费了多少美元, 他请你来帮助他。
输入
第一行一个数T,表示接下来有多少组数据。(T<=10)
接下来每组测试数据的第一行有一个数N(3<=N<=100),表示村庄数目。
然后是一个二维数组,第i行第j列表示第i个村庄到第j个村庄的距离。
接下来每组测试数据的第一行有一个数N(3<=N<=100),表示村庄数目。
然后是一个二维数组,第i行第j列表示第i个村庄到第j个村庄的距离。
输出
只有一个数,输出市长希望知道的已经修成的高铁中最长的路花了多少钱。
样例输入
1
3
0 990 692
990 0 179
692 179 0
样例输出
692
提示
最小生成树
数据量较大输入输出请使用scanf printf
#include <iostream>
#include <stdio.h>
#define RANGE 501
#define MAX 0x7fffffff
using namespace std;
int cost[RANGE][RANGE];
int mincost[RANGE];
bool used[RANGE];
int n;
int Min(int a,int b)
{
return a<b?a:b;
}
void prim()
{
int i,u,v,longest;
longest=-1;
// 以第一个点为起点,初始化mincost和used
for(i=1;i<=n;++i)
{
used[i]=false;
mincost[i]=cost[1][i];
}
while(true)
{
v=-1;
for(u=1;u<=n;++u)
if(!used[u]&&(v==-1||mincost[u]<mincost[v]))//找到与第i个结点连接最短路经的点v
v=u;
// 没有可到达的点,则退出
if(v==-1) break;
used[v]=true;
// 如果当前的边长度大于之前所有边长度则替换
longest= mincost[v]>longest?mincost[v]:longest;
for(u=1;u<=n;++u)
mincost[u]=Min(mincost[u],cost[v][u]);//用mincost[]记录各个结点分别到达结点v的距离,取最小值。
}
// 输出
printf("%d\n",longest);
}
int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
scanf("%d",&cost[i][j]);
prim();
}
return 0;
}