题目训练网址(密码hpuacm): https://cn.vjudge.net/contest/247189
//#include <bits/stdc++.h>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int MAXN = 500+7;
const int INF = 0x3f3f3f3f;
int cost[MAXN][MAXN];
int mincost[MAXN];
bool vis[MAXN];
int n;
void prim()
{
memset(vis, 0, sizeof(vis));
for( int i=1; i<=n; i++ )
mincost[i] = cost[1][i];
int ans = -1;
//int u, v;
while( true )
{
int v = -1;
for( int u=1; u<=n; u++ )
if( !vis[u] && (v == -1 || mincost[u] < mincost[v]) )
v = u;
if( v == -1 ) break;
vis[v] = 1;
ans = max(ans, mincost[v]);
for( int u=1; u<=n; u++ )
mincost[u] = min(mincost[u], cost[v][u]);
}
printf("%d\n", ans);
}
int main()
{
int t;
scanf("%d", &t);
while( t-- )
{
scanf("%d", &n);
for( int i=1; i<=n; i++ )
for( int j=1; j<=n; j++ )
scanf("%d", &cost[i][j]);
prim();
}
return 0;
}
#include <stdio.h>
#include <algorithm>
#include <set>
using namespace std;
const int MAXN = 100 + 7;
struct node{
int a, b, c;
};
struct node road[(MAXN * MAXN) >> 1];
bool cmp( struct node r1, struct node r2 )
{
return r1.c < r2.c;
}
int pre[MAXN];
void init()
{
for( int i=0; i<MAXN; i++ )
pre[i] = i;
}
int find( int x )
{
int r = x;
while( pre[r] != r )
r = pre[r];
int i = x, tmp;
while( i != r )
{
tmp = pre[i];
pre[i] = r;
i = tmp;
}
return r;
}
void join( int a, int b )
{
int fa = find(a);
int fb = find(b);
if( fa != fb )
pre[fa] = fb;
}
int main()
{
int n, m;
while( scanf("%d%d", &n, &m), n )
{
for( int i=0; i<n; i++ )
scanf("%d%d%d", &road[i].a, &road[i].b, &road[i].c);
sort(road, road+n, cmp);
init();
int sum = 0;
int cnt = 0;
int tmp1, tmp2;
for( int i=0; i<n; i++ )
{
tmp1 = road[i].a;
tmp2 = road[i].b;
if( find(tmp1) != find(tmp2) )
{
join(tmp1, tmp2);
sum += road[i].c;
//cnt ++;
//if( cnt == n-1 )
// break;
}
}
set<int> s;
s.clear();
for( int i=1; i<=m; i++ )
{
int tmp = find(i);
if( !s.count(tmp) )
s.insert(tmp);
}
if( s.size() == 1 )
printf("%d\n", sum);
else
printf("?\n");
}
return 0;
}