题意:要求村庄都连接在一起,并且这个值是最小的。
思路:最小生成树Prim算法。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxx=505;
const int inf=0x3f3f3f3f;
int e[maxx][maxx];
int n;
int vis[maxx];
int dist[maxx];
int p[maxx];
int mincost;
void Prim(int u,int n){
for(int i=1;i<=n;i++){
dist[i]=e[u][i];
p[i]=u;
}
vis[u]=1;
dist[1]=0;
for(int i=1;i<=n;i++){
int temp=inf;
int t=u;
for(int j=1;j<=n;j++){
if(!vis[j]&&dist[j]<temp){
temp=dist[j];
t=j;
}
}
if(t==u)break;
vis[t]=1;
mincost=max(mincost,dist[t]);
for(int j=1;j<=n;j++){
if(!vis[j]&&dist[j]>e[t][j]){
dist[j]=e[t][j];
p[j]=t;
}
}
}
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j){
e[i][j]=0;
}else{
e[i][j]=inf;
}
}
}
memset(vis,0,sizeof(vis));
memset(p,0,sizeof(p));
memset(dist,inf,sizeof(dist));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>e[i][j];
}
}
mincost=0;
Prim(1,n);
cout<<mincost<<endl;
}
return 0;
}