最小生成树 记录该最小生成树上的一个最长的路径 scanf接收数据
//kruskal 不断加没有加进最小的边 保证 两个点至少一个没加进点集
#include<iostream>
#include <stdio.h>
#include<algorithm>
using namespace std;
int father[505];
int fun(int x)
{
return x==father[x]?father[x]:fun(father[x]);
}
struct point
{
int x,y,data;
}map[130000];
int com(struct point A,struct point B)
{
return A.data<B.data;
}
int main()
{
int N;
cin>>N;
while (N--)
{
int n,i,j;int len=0;
cin>>n;
for (i=0;i<n;i++)
{
father[i]=i;
int num;j=0;
while(j<n)
{
scanf("%d",&num);
if(j>i)
{
map[len].x=i;
map[len].y=j;
map[len].data=num;
len++;
}
j++;
}
}
sort(map,map+len,com);
int cnt=0;int Max=0;
for (i=0;i<len;i++)
{
if (fun(map[i].x)!=fun(map[i].y))//两个点没有被全加进来过,可以加此边
{
father[fun(map[i].y)]=fun(map[i].x);
cnt++;
if (Max<map[i].data)
{
Max=map[i].data;
}
}
if (cnt==n-1)
{
break;
}
}
cout<<Max<<endl;
}
return 0;
}
//prime 在已找过的点的集合里 找一条最小的边并且另一个点不在该集合
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
int edge[505];//记录最小边
int map[505][505];//记录整个图
bool point[505];//标记已经找过的点
int main()
{
int N;
cin>>N;
while(N--)
{
int n;cin>>n;
int Max=0;
memset(map,0,sizeof(map));
memset(point,0,sizeof(point));
int i,j;
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
scanf("%d",&map[i][j]);
}
edge[i]=65536;
}
int flag=0;//记录每次找到的点
for (i=0;i<n;i++)
{
int temp=65536;//记录最小边
for (j=0;j<n;j++)//更新所有的边
{
if (map[flag][j]&&edge[j]>map[flag][j])
{
edge[j]=map[flag][j];
}
}
for (j=0;j<n;j++)//找到所有的边
{
if (point[j]==0&&edge[j]<temp)
{
temp=edge[j];
flag=j;
}
}
point[flag]=1;
if (Max<temp)
{
Max=temp;
}
}
cout<<Max<<endl;
}
return 0;
}