POj 1797 Heavy Transportation
题意:求从1-n所能承受的最大重量是多少,其最大重量就是1-n通路的最小边
分析:求最大生成树的最小边,排序的时候按照权值从大到小派,然后生成树,知道找到1-n的通路就可以了
#include<stdio.h> #include<algorithm> using namespace std; const int MAXN=1005; const int INF=0x7fffffff; int father[MAXN]; int rank[MAXN]; int ans,n,m; struct Edge { int u,v; int w; }edge[100000];//这里数组开小了re,题目并没有说m的大小,仅仅说了n的大小 bool cmp(Edge a,Edge b) { return a.w>b.w;//这里是关键不是从小到大了 } void Make_set(int n) { for (int i=0;i<=n;i++) { father[i]=i; rank[i]=0; } } int Find_set(int x) { int r=x; while(r!=father[r]) { r=father[r]; } if(r!=x) father[x]=r; return r; } void Union(int x,int y) { if(x==y) return ; if(rank[x]>rank[y]) { father[y]=x; } else { if(rank[x]==rank[y]) { rank[y]++; } father[x]=y; } } void Kruskal(int cas) { sort(edge,edge+cas,cmp); ans=INF; for (int i=0;i<cas;i++) { int x=Find_set(edge[i].u); int y=Find_set(edge[i].v); if(x!=y) Union(x,y); if(ans>edge[i].w) ans=edge[i].w; if(Find_set(1)==Find_set(n)) break; } } int main() { int T,i; int tes=1; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for (i=0;i<m;i++) { scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); } Make_set(n); Kruskal(m); printf("Scenario #%d:\n",tes++); printf("%d\n\n",ans);//后面还有一个空白空格,没看见 } return 0; }