题意:有一个n个点,m条边的无向连通图,每条边有权值。选出一些边,使得满足要求:①图上的点到其他任意一点间都可以直接间接的联通;②选出的道路尽量少;③使选出的边的权值最大值最小。输出最小边数和最小的最大边权。
题解:发现是MST,核心算法库鲁斯卡尔。
CODE:
/* Author: JDD PROG: bzoj1083 繁忙的都市 DATE: 2015.9.22 */ #include <cstdio> #include <algorithm> #define REP(i, s, n) for(int i = s; i <= n; i ++) #define REP_(i, s, n) for(int i = n; i >= s; i --) #define MAX_N 305 using namespace std; struct node{ int u, v, w; }E[MAX_N * MAX_N >> 1]; int n, m; void init() { scanf("%d%d", &n, &m); REP(i, 1, m) scanf("%d%d%d", &E[i].u, &E[i].v, &E[i].w); } int F[MAX_N]; bool cmp(node a, node b) { return a.w < b.w; } #define max(a, b) (a > b ? a : b) int find(int x) { if(F[x] == x) return x; return F[x] = find(F[x]); } void doit() { int ans = 0; REP(i, 1, n) F[i] = i; sort(E + 1, E + m + 1, cmp); REP(i, 1, m){ int rx = find(E[i].u), ry = find(E[i].v); if(rx == ry) continue; F[ry] = rx; ans = max(ans, E[i].w); } printf("%d %d\n", n - 1, ans); } int main() { init(); doit(); return 0; }