UVA-1395 Slim Span
2018-03-01 11:03
281 查看
先给边排好序,然后从小到大枚举开始边,进行Kruskal算法并求出最大边与最小边差值这样取最小值就可以得到最优解
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int MAXN=100+10;//点数 const int MAXM=10000+10;//边数 int UF[MAXN]; struct Edge { int u,v,w; }edge[MAXM]; int tol; //初始化为0 void addedge(int u,int v,int w) { edge[tol].u=u; edge[tol].v=v; edge[tol++].w=w; } bool cmp(Edge a,Edge b) { return a.w<b.w; } int find(int x) { if(UF[x]==-1) return x; else return UF[x]=find(UF[x]); } int Kruskal(int n,int t) { int k=edge[t].w; memset(UF,-1,sizeof(UF)); int cnt=0; int ans=0; for(int i=t;i<tol;i++) { int u=edge[i].u; int v=edge[i].v; int w=edge[i].w; int t1=find(u); int t2=find(v); if(t1!=t2) { UF[t1]=t2; ans=w-k; cnt++; } if(cnt==n-1) break; } if(cnt<n-1) return -1; return ans; } int main() { int n,m; int a,b,c; while(~scanf("%d%d",&n,&m)&&(n||m)) { tol=0; for(int i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); addedge(a,b,c); } sort(edge,edge+tol,cmp); int ans=-1; for(int i=0;i<=tol-n+1;i++) //从第i个边开始 { int ans0=Kruskal(n,i); if(ans==-1) ans=ans0; else if(ans0!=-1) ans=min(ans,ans0); } printf("%d\n",ans); } return 0; }
相关文章推荐
- UVA-1395 Slim Span
- Uva 1395 Slim Span
- (beginer) 最小生成树 UVA 1395 Slim Span
- UVA - 1395 Slim Span(最小生成树)
- UVA 1395 Slim Span
- UVa 1395 slim span
- UVA - 1395 Slim Span
- Uva1395——Slim Span
- UVA 1395 Slim Span
- uva 1395 Slim Span
- UVA - 1395 Slim Span
- UVa 1395 Slim Span
- UVA 1395 Slim Span 最小生成树
- UVa 1395 (最小生成树) Slim Span
- UVA 1395 Slim Span
- UVA 1395 Slim Span
- UVa 1395 Slim Span
- 【UVA】1395-Slim Span
- UVA 1395 Slim Span
- uva1395 Slim Span