#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string.h>
#include <queue> //poj1258 最小生成树prime算法(和Dijkstra算法很类似,除了下面有个地方不同)
#include <vector>
#define inf 10000000
using namespace std;
int n, vis[110], dis[110], map[110][110];
int prime()
{
int t, j, k, min, sum=0;
memset(vis, 0, sizeof(vis));
for(t=0; t<n; ++t)
{
dis[t]=map[0][t];
}
vis[0]=1;
for(j=1; j<n; ++j) //注意,这里少一次循环,因为前面已经选了一个点
{
min=inf;
for(t=0; t<n; ++t)
{
if(!vis[t]&&dis[t]<min)
{
k=t;
min=dis[t];
}
}
vis[k]=1;
sum+=min;
for(t=0; t<n; ++t)
{
if(!vis[t]&&dis[t]>map[k][t])//这里就是和Dijkstra算法不同的地方,Dijkstra算法是时刻和那个单源点相连,而这里保证图联通且权值最小
dis[t]=map[k][t];
}
}
return sum;
}
int main()
{
int t, j, s;
while(scanf("%d", &n)!=EOF)
{
for(j=0; j<n; ++j)
{
for(t=0; t<n; ++t)
{
scanf("%d", &map[j][t]);
}
}
s=prime();
printf("%d\n", s);
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string.h>
#include <queue> //poj2485 最小生成树prime算法---只是在求最小生成树的过程中记录最大的边
#include <vector>
#define inf 100000000
using namespace std;
int n, g, vis[510], dis[510], map[510][510];
void prime()
{
int t, j, k, min, sum=0;
memset(vis, 0, sizeof(vis));
for(t=0; t<n; ++t)
{
dis[t]=map[0][t];
}
g=0;
vis[0]=1;
for(j=1; j<n; ++j) //注意,这里少一次循环,因为前面已经选了一个点
{
min=inf;
for(t=0; t<n; ++t)
{
if(!vis[t]&&dis[t]<min)
{
k=t;
min=dis[t];
}
}
vis[k]=1;
if(g<min)g=min;
sum+=min;
for(t=0; t<n; ++t)
{
if(!vis[t]&&dis[t]>map[k][t])//这里就是和Dijkstra算法不同的地方,Dijkstra算法是时刻和那个单源点相连,而这里保证图联通且权值最小
dis[t]=map[k][t];
}
}
return ;
}
int main()
{
int t, j, T;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(j=0; j<n; ++j)
{
for(t=0; t<n; ++t)
{
scanf("%d", &map[j][t]);
}
}
prime();
printf("%d\n", g);
}
return 0;
}