pku 3522 Slim Span//求最小生成数的边差最小 一开始不知道怎么下手,思路是想按权差排序,后来发现不对!! 后来晓得时限是5s,就知道是暴力了,于是乎暴力解题== #include <iostream> #include <algorithm> #define inf 0x7fffffff using namespace std; struct node { int u,v; int w; }Q[5001]; int n,m,s[101],flag; int find(int x)//并查集查找 { return x == s[x]?x:s[x] = find(s[x]); } bool cmp(const node a, const node b) { return a.w<b.w; } int kruskal() { int i,ans = inf,min1,max1,k,j,ii,cnt; for(i = 0; i<m; i++) { k = cnt = 0; for(j = 1; j<=n; j++)s[j] = j; for(j = i; j<m; j++)//暴力枚举每条边 { int x = find(Q[j].u); int y = find(Q[j].v); if(x!=y) { s[x] = y; if(k == 0) { max1 = min1 = Q[j].w; k++; } else { if(Q[j].w>max1)max1 = Q[j].w; if(Q[j].w<min1)min1 = Q[j].w; } } } for(ii = 1; ii<=n; ii++)//如果是最小生成树,那么只有一个父亲节点 if(s[ii] == ii)cnt++; if(cnt == 1) { flag = 1; if(ans>max1 - min1)ans = max1 - min1;//最大值跟新 } } if(flag)return ans; else return -1; } int main() { int i,j; while(cin>>n>>m) { if(n == 0&&m == 0)break; flag = 0; for(i = 0; i<m; i++) scanf("%d %d %d",&Q[i].u,&Q[i].v,&Q[i].w); sort(Q,Q+m,cmp); int ans = kruskal(); cout<<ans<<endl; } return 0; }