标签:
题意:告诉你n个点,m条边,问你他们的生成树中最长边与最短边的差值的最小值是多少,如果图不联通输出-1.
思路:Kruskal算法,枚举起始边,对于每一次kruskal算法,最后一条边必然是最长边,直接返回跟起始边的差值。
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> #include <map> #include <set> #include <queue> #include <vector> #include <cmath> using namespace std; const int INF=0x3f3f3f3f; const int MAXN=110; const int MAXM=5500; int n,m; struct Edge{ int u,v,w; }edge[MAXM]; int par[MAXN]; bool cmp(Edge a,Edge b) { return a.w<b.w; } void init() { for(int i=0;i<=n;i++) par[i]=i; } int find(int x) { return x==par[x]?x:par[x]=find(par[x]); } int Kruskal(int flag) { init(); int cnt=0; for(int i=flag;i<m;i++) { int u=find(edge[i].u); int v=find(edge[i].v); if(u!=v) { par[v]=u; cnt++; } if(cnt==n-1) return edge[i].w-edge[flag].w; } return -1;//不联通 } int main() { //freopen("in.txt","r",stdin); while(scanf("%d%d",&n,&m)&&(n||m)) { for(int i=0;i<m;i++) scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); sort(edge,edge+m,cmp); int ans=Kruskal(0); for(int i=1;i<m-n+2;i++) { int tmp=Kruskal(i); if(tmp!=-1) ans=min(ans,tmp); } printf("%d\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/onlyAzha/p/4782051.html