题目链接:http://poj.org/problem?id=2485
Description
Input
Output
Sample Input
1 3 0 990 692 990 0 179 692 179 0
Sample Output
692
Hint
Source
题意:
寻找最小生成树图中最长的路径!
和POJ 1258 一样的,加个判断条件就可以了!
但是注意这题用memset 初始化visited会WA, 用for循环就不会了!POJ 1258 则不存在这个问题!
代码如下:
#include <cstdio>
#include <cstring>
#define INF 0x3f3f3f3f
#define MAXN 517
//创建m二维数组储存图表,low数组记录每2个点间最小权值,visited数组标记某点是否已访问
int m[MAXN][MAXN], low[MAXN], visited[MAXN];
int n;
int prim( )
{
int i, j;
int maxx = 0;
int pos, minn, result=0;
// memset(visited,0,sizeof(visited));
for(i = 1; i <= n; i++)
visited[i] = 0;
visited[1] = 1;
pos = 1; //从某点开始,分别标记和记录该点
for(i = 1; i <= n; i++) //第一次给low数组赋值
{
if(i != pos)
low[i] = m[pos][i];
else
low[i] = 0;
}
for(i = 1; i < n; i++) //再运行n-1次
{
minn = INF; //找出最小权值并记录位置
for(j = 1; j <= n; j++)
{
if(visited[j]==0 && minn>low[j])
{
minn = low[j];
pos = j;
}
}
// result += minn; //最小权值累加
if(minn > maxx)
maxx = minn;
visited[pos] = 1; //标记该点
for(j = 1; j <= n; j++) //更新权值
if(visited[j]==0 && low[j]>m[pos][j])
low[j] = m[pos][j];
}
//return result;
return maxx;
}
int main()
{
int i,j,ans;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(m,INF,sizeof(m)); //所有权值初始化为最大
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
scanf("%d",&m[i][j]);
}
}
ans = prim( );
printf("%d\n",ans);
}
return 0;
}
poj 2485 Highways(最小生成树),布布扣,bubuko.com
原文地址:http://blog.csdn.net/u012860063/article/details/38664391