將邊按權值排序後,枚舉最小權值的邊,ios
從第一個邊開始,直到日後可以構成生成樹,而且記錄中間出現過的最大權值和最小權值,spa
最後不斷取最小值便可code
切記每次枚舉前,都要初始化父親節點blog
1 #include<cstdio> 2 #include<cstring> 3 #include<cctype> 4 #include<cstdlib> 5 #include<cmath> 6 #include<iostream> 7 #include<sstream> 8 #include<iterator> 9 #include<algorithm> 10 #include<string> 11 #include<vector> 12 #include<set> 13 #include<map> 14 #include<deque> 15 #include<queue> 16 #include<stack> 17 #include<list> 18 typedef long long ll; 19 typedef unsigned long long llu; 20 const int MAXN = 100 + 10; 21 const int MAXT = 100000 + 10; 22 const int INF = 0x7f7f7f7f; 23 const double pi = acos(-1.0); 24 const double EPS = 1e-6; 25 using namespace std; 26 27 struct Line{ 28 int be, en, v; 29 Line() : be(0), en(0), v(0) {} 30 bool operator < (const Line &b) const{ 31 return v < b.v; 32 } 33 }p[MAXT]; 34 35 int fa[MAXN], n, m; 36 37 int find(int v){ 38 return fa[v] = fa[v] == v ? v : find(fa[v]); 39 } 40 41 int init(){ 42 for(int i = 0; i <= n; ++i) fa[i] = i; 43 } 44 45 int main(){ 46 while(scanf("%d%d", &n, &m) == 2 && (n || m)){ 47 for(int i = 0; i < m; ++i) scanf("%d%d%d", &p[i].be, &p[i].en, &p[i].v); 48 sort(p, p + m); 49 int ans = INF; 50 for(int i = 0; i < m; ++i){ 51 int tmp = 0, cnt = n, ma = -1, mi = INF; 52 init(); 53 for(int j = i; j < m; ++j){ 54 int t1 = find(p[j].be); 55 int t2 = find(p[j].en); 56 if(t1 != t2){ 57 fa[t1] = t2; 58 ma = max(ma, p[j].v); 59 mi = min(mi, p[j].v); 60 if(--cnt == 1) break; 61 } 62 } 63 if(cnt == 1) ans = min(ans, ma - mi); 64 else break; 65 } 66 printf("%d\n", ans == INF ? -1 : ans); 67 } 68 return 0; 69 }