POJ1797 Heavy Transportation(最大生成树解)

寂寞了,A个水题

 

题目大意是,给出 N 个城市之间的 M 条路径,每条路径都有一个最大载重量,问从城市 1 到城市 N 最多能承受的货物重量。

 

方法多种多样,比如用网络流算法找最大权值增广路,比如最大生成树的最小边权,再比如直接 Dij 找……

discuss里面各种提示啊,各种晒代码啊……

神马 Floyd 啊,神马 SPFA 啊,神马 BFS ,DFS啊,还有神马 BS_poj 啊……

 

真心佩服出题的,这才是神题啊,各种思路,咋整都中,一点都不限制思路。想想自己给小盆友们出的,唉,汗颜啊……

 

好啦,不扯了,贴代码啦,我用的是并查集,最大生成树搞的

中间Wa数次,因为忘记了循环里面加上建树是否完成的判断

 

#include<stdio.h> #include<string.h> #include<stdlib.h> #define N 1000001 #define Max 99999999 struct node { int from,to; int w; }edge[N]; int cmp(const void *a,const void *b) { struct node *aa=(struct node *)a; struct node *bb=(struct node *)b; return bb->w - aa->w; } int father[N]; int n,m,time=1; int findx(int x) { if(father[x]!=x) father[x]=findx(father[x]); return father[x]; } void merge(int a,int b) { int x,y; x=findx(a); y=findx(b); if(x!=y)father[x]=y; } void getmap() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d%d",&edge[i].from,&edge[i].to,&edge[i].w); } void solve() { int i; if(n==1) { printf("Scenario #%d:/n0/n/n",time++);return; } qsort(edge+1,m,sizeof(edge[1]),cmp); int min_w=Max; for(i=1;i<=n;i++) father[i]=i; for(i=1;i<=m;i++) { if( findx(n)==findx(1) )break; if(edge[i].w<min_w) min_w=edge[i].w; merge(edge[i].from,edge[i].to); father[ edge[i].from ]=findx(edge[i].from); father[ edge[i].to ]=findx(edge[i].to); } printf("Scenario #%d:/n%d/n/n",time++,min_w); } int main() { int t; scanf("%d",&t); while(t--) { getmap(); solve(); } return 0; } 

你可能感兴趣的:(算法,网络,struct,merge)