题目:http://poj.org/problem?id=2485
题意:求最小生成树中的最长边。简单题。
想法:prim()
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=510;
bool vis[maxn];
int dis[maxn],link[maxn][maxn];
int n,m,ans;
int prim(){
for(int i=1;i<=m;i++)
dis[i]=INF;
dis[1]=0;
ans=0;
memset(vis,false,sizeof(vis));
for(int i=1;i<=m;i++){
int minn=INF,pos;
for(int j=1;j<=m;j++){
if(dis[j]<minn&&!vis[j]){
minn=dis[j];
pos=j;
}
}
vis[pos]=true;
ans=max(ans,minn);
for(int k=1;k<=m;k++){
if(!vis[k]&&dis[k]>link[pos][k]){
dis[k]=link[pos][k];
}
}
}
return ans;
}
int main(){
//freopen("123.txt","r",stdin);
scanf("%d",&n);
while(n--){
scanf("%d",&m);
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
scanf("%d",&link[i][j]);
}
}
cout<<prim()<<endl;
}
return 0;
}