思路
按照最小生成树来做就行,不要受样例的影响。
代码
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int par[1010];
int get_par(int a)
{
if(par[a]<0) return a;
else return par[a] = get_par(par[a]);
}
void merge(int a, int b)
{
int pa = get_par(a);
int pb = get_par(b);
if(pa!=pb)
{
par[pb] = pa;
}
}
bool query(int a, int b)
{
return get_par(a) == get_par(b);
}
struct node
{
int x, y;
int value;
node& operator=(const node& rhs)
{
x = rhs.x;
y = rhs.y;
value = rhs.value;
return *this;
}
}edge[15010];
struct cmp
{
bool operator()(const node& a, const node& b)
{
return a.value<b.value;
}
};
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for(int i=0; i<m; i++)
scanf("%d%d%d", &edge[i].x, &edge[i].y, &edge[i].value);
sort(edge, edge+m, cmp());
memset(par, -1, sizeof(par));
for(int i=0, j=0; i<m; i++)
{
if(!query(edge[i].x, edge[i].y))
{
merge(edge[i].x, edge[i].y);
edge[j++] = edge[i];
}
if(j==n-1) break;
}
printf("%d\n%d\n", edge[n-2].value, n-1);
for(int i=0; i<n-1; i++)
{
printf("%d %d\n", edge[i].x, edge[i].y);
}
return 0;
}