這題做的囧死,看了範例很興奮的寫了個dijkstra交上去WA,重新看了下題目,發現是每條路都有一個最大承載量,好吧,我又想錯了,發現不是網路流,因為範例用最大流說不通,再仔細看了一遍題目,發現是叫你找一條路使得單條路的流量最大,果斷寫了個最大產生樹,覺得最大產生樹的最小邊就是解,叫上去,再次WA。
想了一會兒才發現不對,如果有一條路流量很大,但是這條路建出來的時候產生樹沒有建好呢?後來在Kruskal函數裡加了一句很重要的話,果斷AC。。。。。
本題的思路就是求最大產生樹,當1和n在一個集合裡的時候就返回最小邊權,這個邊權就是解。
My Code:
#include <cstdio><br />#include <cstdlib><br />#include <cstring><br />#include <algorithm><br />using namespace std;<br />const int MAX=1100;<br />const int oo=0x3f3f3f3f;<br />struct Edge{<br />int u,v,len;</p><p>bool operator<(const Edge& e) const{<br />return len>e.len;<br />}</p><p>void read(){<br />scanf("%d%d%d",&u,&v,&len);<br />}<br />}e[MAX*MAX];<br />int p[MAX],rank[MAX],n,m;<br />void init(){<br />for(int i=1;i<=n;i++){<br />p[i]=i;<br />rank[i]=0;<br />}<br />}<br />int find(int x){<br />return p[x]=x==p[x]?p[x]:find(p[x]);<br />}<br />void Link(int x,int y){<br />if(rank[x]>rank[y]){<br />p[y]=x;<br />}else{<br />p[x]=y;<br />if(rank[x]==rank[y]){<br />rank[y]++;<br />}<br />}<br />}<br />bool merge(int x,int y){<br />int px=find(x);<br />int py=find(y);</p><p>if(px==py){<br />return false;<br />}<br />Link(px,py);<br />return true;<br />}<br />int Kruskal(){<br />int ret=0;<br />int cnt=1;</p><p>init();<br />sort(e,e+m);<br />for(int i=0;i<m&&cnt<n;i++){<br />if(merge(e[i].u,e[i].v)){<br />cnt++;<br />ret=e[i].len;<br />}<br />if(find(1)==find(n)){<br />break;<br />}<br />}</p><p>return ret;<br />}<br />int main(){<br />int t,cnt=1;<br />bool done=false;</p><p>scanf("%d",&t);<br />while(t--){<br />if(done){<br />puts("");<br />}else{<br />done=true;<br />}<br />scanf("%d%d",&n,&m);<br />for(int i=0;i<m;i++){<br />e[i].read();<br />}<br />printf("Scenario #%d:/n",cnt++);<br />printf("%d/n",Kruskal());<br />}</p><p>return 0;<br />}<br />