zznu 1983
最小生成树的变形,关键是想不到,想到也就不会觉得难了
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<cctype>
#include<algorithm>
#include <vector>
#include <queue>
using namespace std;
#define INF 0x3f3f3f3f
#define N 500
int maps[N][N];
int dist[N], vis[N];
void Init(int n)
{
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
maps[i][j]=i==j ? 0 : INF;
}
int Prim(int n)
{
for(int i=1; i<=n; i++)
dist[i]=maps[0][i];
memset(vis, 0, sizeof(vis));
vis[0]=1;
int sum=0, Min, index;
while(1)
{
Min=INF;
for(int i=0; i<=n; i++)
if(!vis[i]&&Min>dist[i])
{
Min=dist[i];
index=i;
}
if(Min==INF)
break;
sum+=Min;
vis[index]=1;
for(int i=0; i<=n; i++)
if(!vis[i]&&maps[index][i]<dist[i])
dist[i]=maps[index][i];
}
return sum;
}
int main()
{
int T, n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
Init(n);
for(int i=0; i<=n; i++)
for(int j=1; j<=n; j++)
scanf("%d", &maps[i][j]);
int ans=Prim(n);
printf("%d
", ans);
}
return 0;
}