裸最小生成树,结果还是出现了几个问题!!!首先
v数组在初始化的时候要设成最大值,其次要对每一个访问过的点visited更新,
v数组在初始化的时候要设成最大值,其次要对每一个访问过的点visited更新,
#include <iostream>
#include <limits>
#include <limits.h>
#include <stdio.h>
using namespace std;
const int MAXN=501;
int map[MAXN][MAXN];
int visited[MAXN];
int v[MAXN];
int m;
int ans;
void prim()
{
visited[1]=1;
for(int i=1;i<=m;i++)
{
if(map[1][i]!=0)
{
v[i]=map[1][i];
//printf("%d\n",i);
}
}
for(int i=2;i<=m;i++)
{
int num=-1;
int max1=INT_MAX;
for(int j=1;j<=m;j++)
{
if(visited[j]==1||v[j]==0)
{
continue;
}
if(v[j]<max1)
{
max1=v[j];
num=j;
}
}
visited[num]=1;
//printf("%d!\n",num);
if(num==-1)
{
return ;
}
if(v[num]>ans)
{
ans=v[num];
}
for(int j=1;j<=m;j++)
{
if(visited[j]==1)
continue;
if(map[num][j]!=0&&map[num][j]<v[j])
{
v[j]=map[num][j];
}
}
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
for(int i=0;i<MAXN;i++)
{
visited[i]=0;
v[i]=INT_MAX;
for(int j=0;j<MAXN;j++)
{
map[i][j]=0;
}
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
}
}
ans=0;
prim();
printf("%d\n",ans);
}
return 0;
}