ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P1396 营救+生成树

2020-04-18 20:03:54  阅读:212  来源: 互联网

标签:node const P1396 生成 int 算法 include 营救


算法

最小生成树

思路

其实就是一道最小生成树的模板题,我在这里用的是kruskal算法,唯一需要注意的是每加入一条边都要判断s,t是不是在一个集合里面,这样就可以顺利AC了。(排序了)

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int fa[10005];
struct node{
    int x,y,z;
}; 
node way[20010];
int n,m,s,t,tot=0;
int com(const node &c,const node &d)
{
    return c.z<d.z;
}
int find(int g)  //找到该元素所在集合的代表元素
{
    if (fa[g]!=g)
       fa[g]=find(fa[g]);
    return fa[g];
}
int unionn(int s1,int s2)  //合并集合的过程
{
    int r1=find(s1);
    int r2=find(s2);
    if (r1!=r2)
       fa[r1]=r2;
}
int js()
{
    int i,j,k;
    k=1;
    i=1;
    while (k<n)
    {
        while (find(way[i].x)==find(way[i].y))
            i++;
        tot=max(way[i].z,tot);   //因为求的是最大值,所以用了一个max,其实没必要这么麻烦,因为边一定是从大到小的,后加入的边一定较大,可以直接写tot=way[i].z;
        unionn(way[i].x,way[i].y);  //这里就是一个并查集处理
        k++;
        if (find(s)==find(t))  //判断,自认为是这道题最重要的细节
           break;
    }
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&s,&t);
    int i;
    for (i=1;i<=m;i++)
    {
       scanf("%d%d%d",&way[i].x,&way[i].y,&way[i].z);
    }
    for (i=1;i<=n;i++)
      fa[i]=i;
    sort(way+1,way+1+m,com);  //把边从小到大排序
    js();
    printf("%d",tot);
    return 0;
}

  

 

标签:node,const,P1396,生成,int,算法,include,营救
来源: https://www.cnblogs.com/ruanmowen/p/12727698.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有