传送门ios
钢哥终于没给黑题紫题了(卑微v算法
稍稍须要多想一点点测试
--------------------------------------------------------------------------------------------------------优化
题意简述spa
求全部生成树中最大边权与最小边权差最小的,输出它们的差值。code
输入:blog
输入文件包含多组测试数据,每组测试数据以下: 第1行:2个整数n m (2 ≤ n ≤ 100 and 0 ≤ m ≤ n(n − 1)/2),n表示顶点数,m表示边数。接下来m行,每行3个空格分开的整数a b w(1 ≤ w ≤ 10000) , 表示顶点a与顶点b之间有一条边,权值为w。排序
输出:get
对每组测试数据,若是图存在生成树,输出生成树的差值最小的;不然,输出-1。string
--------------------------------------------------------------------------------------------------------
因为n的值比较小
因此能够不用那种优化到极致的神仙算法/思路(能够小小的偷偷懒
把全部边按边权排序
从每一个边求最小生成树
用最小生成树中的最大边权和最小边权的差来更新最终的ans
O(q*mlogm)
--------------------------------------------------------------------------------------------------------
最后有两个0 0方便退出询问
可是...也算是个小坑吧
--------------------------------------------------------------------------------------------------------
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring>
using namespace std; inline int read() { int sum = 0,p = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') p = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { (sum *= 10) += ch - '0'; ch = getchar(); } return sum * p; } const int INF = 99999; int n,m,ans,maxns; struct edge { int frm,to,wei; }e[5005]; int fa[105]; bool cmp(edge a,edge b) { return a.wei < b.wei; } int findfa(int o) { if(fa[o] == o) return o; else
return fa[o] = findfa(fa[o]); } int kruskal(int o) { int k = 0; maxns = -1; for(int i = 1;i <= n;i++) fa[i] = i; int minn = e[o].wei,maxn = 0; for(int i = o;i <= m;i++) { int a = findfa(e[i].frm); int b = findfa(e[i].to); if(a == b) continue; ++k; fa[a] = b; maxns = max(maxns,e[i].wei); if(k == n - 1) return 1; } return 0; } int main() { while(~scanf("%d%d",&n,&m)) { if(n == 0 && m == 0) return 0; ans = INF; memset(e,0,sizeof(e)); memset(fa,0,sizeof(fa)); for(int i = 1;i <= m;i++) { e[i].frm = read(); e[i].to = read(); e[i].wei = read(); } sort(e+1,e+m+1,cmp); for(int i = 1;i <= m;i++) { if(kruskal(i)) ans = min(ans,maxns - e[i].wei); } if(ans == INF) ans = -1; printf("%d\n",ans); } return 0; }