【题解】P1396 营救-C++

原题传送门

这道题目基本就是一个克鲁斯卡尔最小生成树的模板题,唯一不同的是,这道题目的最终目标不是所有点相连,而是只要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 }

 

posted @ 2019-07-19 15:05  摸鱼酱  阅读(1002)  评论(0编辑  收藏  举报