继续复习prim算法
注意本题的要求是输出最小生成树中的最大边
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <set>
#include <cctype>
#include <algorithm>
#include <cmath>
#include <deque>
#include <queue>
#include <map>
#include <queue>
#include <list>
#include <iomanip>
using namespace std;
///
///
const int INF = 20000000;
#define maxn 505
#define max(a,b)(a>b?a:b)
///
int T;
int N;
int cost[maxn][maxn];//邻接矩阵,不能到达置为inf
int lowc[maxn];//记录某点出发到各点的数值
bool vis[maxn];//是否被加入MST中
int prim()
{
int i, j, s;
int minc;
int ans = 0;
memset(vis, false, sizeof(vis));
//初始化第一个结点和花费数组
vis[1] = true;
for (i = 2; i <= N; i++)
lowc[i] = cost[1][i];
//对剩余结点进行迭代
for (i = 2; i <= N; i++)
{
minc = INF;
s = -1;//当前最小结点编号
for (j = 1; j <= N; j++)
{
if (0 == vis[j] && minc > lowc[j])
{
minc = lowc[j];
s = j;
}
}
if (ans < minc)
ans = minc;//找到新的MST边的数值更大则更新
vis[s] = true;
for (j = 1; j <= N; j++)
{
if (0 == vis[j] && lowc[j] > cost[s][j])
lowc[j] = cost[s][j];
}
}
return ans;
}
int main()
{
///
int i, j;
scanf("%d", &T);
while (T--)
{
cin >> N;
//建图
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
scanf("%d", &cost[i][j]);
int ans = prim();
printf("%d\n", ans);
}
///
return 0;
}