苗條的生成樹 Slim Span--洛谷

傳送門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; } 
相關文章
相關標籤/搜索