这道题目基本就是一个克鲁斯卡尔最小生成树的模板题,唯一不同的是,这道题目的最终目标不是所有点相连,而是只要s和t相连就可以了。还有就是这道题目求的是最小生成树中的最大边权值。
但是,克鲁斯卡尔是从最小的边权值开始考虑的,当s和t第一次连通时考虑的那条边,就是当前考虑的最大的权值的边,直接输出就可以了啊。
代码也很简单,贴一下:
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct noded 4 { 5 int u,v; 6 int w; 7 noded(){} 8 noded(int uu,int vv,int ww) 9 { 10 u=uu,v=vv,w=ww; 11 } 12 }mp[200010]; 13 bool cmp(noded x,noded y) 14 { 15 return x.w<y.w; 16 } 17 int fa[5010]; 18 int get(int x) 19 { 20 if(fa[x]==x)return x; 21 else 22 { 23 fa[x]=get(fa[x]); 24 return fa[x]; 25 } 26 } 27 bool merge(int x,int y) 28 { 29 int r1=get(x),r2=get(y); 30 if(r1!=r2) 31 { 32 fa[r1]=r2; 33 return true; 34 } 35 else return false; 36 } 37 int ans[250010]; 38 void init() 39 { 40 for(int i=1;i<=5000;i++) 41 { 42 fa[i]=i; 43 } 44 } 45 int main() 46 { 47 //sqrt(pow((x1-x2),2)+pow((y1-y2),2)); 48 int n,p,s,t; 49 cin>>n>>p>>s>>t; 50 for(int i=1;i<=p;i++) 51 { 52 cin>>mp[i].u>>mp[i].v>>mp[i].w; 53 } 54 sort(mp+1,mp+1+p,cmp); 55 //for(int i=1;i<=k;i++) 56 //{ 57 // cout<<endl<<mp[i].w; 58 //} 59 init(); 60 int cnt=0; 61 int ans=0; 62 for(int i=1;i<=p;i++) 63 { 64 if(merge(mp[i].u,mp[i].v)) 65 { 66 if(get(s)==get(t)) 67 { 68 cout<<mp[i].w<<endl; 69 return 0; 70 } 71 if(cnt==p-1) break; 72 } 73 } 74 return 0; 75 }