题目大意:求最小生成树,并输出最小生成树中权值最大的边,
解题思路:用prim算法.
prim算法思想参考:Veegin
#include <iostream>
#include <memory.h>
using namespace std;
#define N 505
#define MAXINT 65538
int n;
int result;
int map[N][N];//存储distance
bool visited[N];//记录一个点是否被访问过
int low[N];//记录当前点到临近点的距离
int prim()
{
int curPos = 1;//设当前点为1
result = 0;
int tempMin;
memset(low,0,sizeof(low));
memset(visited,false,sizeof(visited));
for(int i = 1;i <= n;i++)//更新当前点到邻近点的距离
if(i != curPos) low[i] = map[curPos][i];
visited[1] = true;
for(int i = 1;i < n;i++)//再运行n-1次
{
tempMin = MAXINT;
for(int j = 1;j <= n;j++)//找出权值最小的值和点
{
if(!visited[j] && tempMin > low[j])
{
tempMin = low[j];
curPos = j;
}
}
result = (tempMin > result ? tempMin : result);//更新最大的边
visited[curPos] = true;
for(int j = 1;j <= n;j++)//更新curPos到其他点的权值
{
if(!visited[j] && map[curPos][j] < low[j])
low[j] = map[curPos][j];
}
}
return result;
}
int main()
{
int caseNum;
memset(map,MAXINT,sizeof(map));
cin >> caseNum;
while(caseNum--)
{
cin >> n;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
{
cin >> map[i][j];
map[j][i] = map[i][j];
}
cout << prim() << endl;
if(caseNum)
cout << endl;
}
return 0;
}