UVa1395(最小值最小生成树+并查集)

来源:互联网 发布:淘宝卖家不给发票投诉 编辑:程序博客网 时间:2024/05/20 20:43

//思路:用结构体保存一条边的信息(u,v,w),因为是求最小的生成树,所以把边排序后,从最小的边(起点)依次枚举可以构成的生成树


AC源码:

#include <cstdio>#include <iostream>#include <algorithm>#include <vector>using namespace std;const int INF=(1<<30);int n,m,MIN_NUM=INF,p[105];int findset(int x){return p[x]==x?x:p[x]=findset(p[x]);}struct Edge{int u,v,w;Edge(int a,int b,int c):u(a),v(b),w(c){}bool operator<(const Edge& rhs){return w<rhs.w;}};vector<Edge> Evec;void solve(){int len=Evec.size();for(int i=0;i<=len-(n-1);++i){int cnt=n;for(int k=1;k<=n;++k)p[k]=k;for(int j=i;j<len;++j){int x=findset(Evec[j].u),y=findset(Evec[j].v);if(x!=y){p[x]=y;if(--cnt==1){MIN_NUM=min(MIN_NUM,Evec[j].w-Evec[i].w);break;}}}}}int main(){while(scanf("%d %d",&n,&m)&&n){Evec.clear();int u,v,w;while(m--){scanf("%d %d %d",&u,&v,&w);Evec.push_back(Edge(u,v,w));}sort(Evec.begin(),Evec.end());MIN_NUM=INF;solve();if(MIN_NUM==INF)printf("-1\n");elseprintf("%d\n",MIN_NUM);}return 0;}