题意:给定n个结点的图,求最大边的权值减去最小边的权值最小的生成树。
析:这个和最小生成树差不多,从小到大枚举左端点,对于每一个左端点,再枚举右端点,不断更新最小值。挺简单的一个题。
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 100 + 5; const int INF = 0x3f3f3f3f; int p[maxn]; struct node{ int u, v, w; bool operator <(const node& p) const { return w < p.w; } }; node a[10000]; int Find(int x){ return x == p[x] ? x : p[x] = Find(p[x]); } int main(){ int n, m; while(scanf("%d %d", &n, &m)){ if(!m && !n) break; for(int i = 0; i < m; ++i) scanf("%d %d %d", &a[i].u, &a[i].v, &a[i].w); sort(a, a+m); int ans = INF; for(int l = 0; l < m; ++l){//枚举左端点 int cnt = n; for(int i = 0; i <= n; ++i) p[i] = i; for(int r = l; r < m; ++r){//枚举右端点 int x = Find(a[r].u); int y = Find(a[r].v); if(x != y){ p[x] = y; --cnt; if(1 == cnt){ ans = min(ans, a[r].w-a[l].w);//更新最小值 break; } } } } printf("%d\n", INF == ans ? -1 : ans); } return 0; }
代码如下: