标签:name star cost most exp 技术分享 mina str ret
Input
Output
Sample Input
1 3 3 1 2 3 1 3 4 2 3 5
Sample Output
Scenario #1: 4
这题题意理解很重要,大致意思是给出每条路的载重,求每条路连通且总载重最大时的最小边的值。
(在这里吐槽下网上说的最小值的最大值,看了半天都不理解,我还专门去查了下博弈论和唯物辩证法,都没有关于最小值的最大值的解释,希望以后能懂)
这题我用的是kruskal求的最大生成树(其实就是把从小到大排序变成从大到小排序了),这题还可以用spfa和dijkstra,这里就不尝试了。
好了不废话了,附代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 using namespace std; 6 const int inf = 0x3f3f3f3f; 7 const int M = 1005; 8 struct nod{ 9 int u,v,cost; 10 }eg[M*M/2]; 11 int V,E; 12 bool cmp(const nod&a,const nod&b){ 13 return a.cost>b.cost; 14 } 15 int rk[M],pre[M]; 16 void init(int V){ 17 for(int i=0;i<=V;i++){ 18 rk[i]=0; 19 pre[i]=i; 20 } 21 } 22 int find(int x){ 23 if(pre[x]==x) { 24 return x; 25 } else{ 26 return pre[x]=find(pre[x]); 27 } 28 } 29 void mix(int x,int y){ 30 x=find(x); 31 y=find(y); 32 if(x==y) return ; 33 if(rk[x]<y){ 34 pre[x]=y; 35 } else{ 36 pre[y]=x; 37 if(rk[x]==rk[y]){ 38 rk[x]++; 39 } 40 } 41 } 42 int kruskal(){ 43 sort(eg,eg+E,cmp); 44 // printf("%d\n",E); 45 int minn=inf; 46 for(int i=0;i<E;i++){ 47 nod e=eg[i]; 48 if(find(e.u)!=find(e.v)){ 49 mix(e.u,e.v); 50 if(find(1)==find(V)){ 51 minn=e.cost; 52 break; 53 } 54 } 55 } 56 return minn; 57 } 58 int main(){ 59 int t; 60 int cas=0; 61 scanf("%d",&t); 62 while(t--){ 63 scanf("%d %d",&V,&E); 64 init(V); 65 // int u,v,cost; 66 for(int i=0;i<E;i++){ 67 scanf("%d %d %d",&eg[i].u,&eg[i].v,&eg[i].cost); 68 } 69 printf("Scenario #%d:\n%d\n\n",++cas,kruskal()); 70 71 } 72 return 0; 73 }
POJ - 1797 Heavy Transportation
标签:name star cost most exp 技术分享 mina str ret
原文地址:http://www.cnblogs.com/zmin/p/7421021.html