并查表(习题提升)

修复公路

首先直接上结论,这题要用到排序并查集
为啥要用到并查集:这很显然,主要是有关键语句,道路是双向,也就是说即使A和B没有修路,但是B和C之间修路了,A和C之间修路,那么A和B也算是可以相互抵达的,这么看A,B,C是不是一种父节点和子节点关系,ABC是这样的,那么其他的道路也是这样的,那么就可以将建有双向到道的村庄变成一个并查集,这就是为啥要用到并查集的原因。

那为啥要用到排序呢?;由于这个工程是同时开始修建的,所以小的时间是可以被包括在大的时间里面的,我们要在尽量小的时间里面就可以看到全部的村庄都建设其双向道路有可能就是在前面就已经将双向道路全部建设好了,所以我们要将时间的升序来进行排列(大白话就是要尽量取小),在这里还要用到C++里面的库函数sort函数。 

  那么就下是如何使用sort函数:sort函数中含有三个变量,第一个和第二个是需要排序的范围(就是数组名加上数字),然后第三个就是决定升序或者降序的,如果不进行填写就是代表着升序。头文件在include<algorithm>,这个英文单词也是算法的意思

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
	int a[10];
	for(int i=1;i<=5;i++)
	cin>>a[i];
	sort(a+1,a+5);
	for(int i=1;i<=5;i++)
	cout<<a[i]<<"  ";
	return 0;
}

降序就在最后面加上一个greater<int>() 
升序就是在最后加一个less<int>() (或者可以什么都不写)

sort(a, a + n, greater<int>());//降序排列
sort(a, a + n, less<int>());//升序排列

接下来就是有关如何用sort函数来编写对结构体的排序:
主要就是对结构体其中的某个元素进行排序,然后将结构体全部元素都进行一个排序,所以这里最关键的就是对“标准”的定义(大白话就是对哪一个元素排序)。
首先我们就需要构造一个结构体

struct node
{
    int x,y,t;
} q[N];

标准的制定 可以使用一个bool函数cmp(node x,node y),由于这个函数返回值是正确或者错误,所以就可以选择哪个这个来定义是选择哪个元素进行排序,。

bool cmp(node x,node y)
{
    return x.t<y.t;//这个就是升序的标准,反过来就是降序
}

然后再将这个标准放在sort函数中的最后一位

sort(q,q+m,cmp);

接下来就是编写这个题的代码(注意着里一定考虑自己写的变量是否和库函数有重合的,当时我就是没有考虑重合导致的一直过不去,浪费我一个下午的时间,说句实话这个时间浪费的不值得,还是多亏了一个大牛(如果你看到了,我再次表示我的谢意)告诉了我,我才知道错在那里)

#include<iostream>
#include<algorithm>
#define N 1000005
using namespace std;
int n,m;
int con;
int fa[N];

int cha(int x)
{
    if(fa[x]==x)
        return x;
    return cha(fa[x]);
}

void Union(int r1,int r2)
{

    if(r1!=r2)
    {
        if(r1>r2)
        {
            fa[r1]=r2;
            con--;
        }
        else
        {
            fa[r2]=r1;
            con--;
        }
    }
}

void Initial()
{
    for(int i=1; i<=n; i++)
    {
        fa[i]=i;
    }
    return ;
}

struct node
{
    int x,y,t;
} q[N];

bool cmp(node x,node y)
{
    return x.t<y.t;
}

int main()
{
    cin>>n>>m;
    con=n;
    for(int i=0; i<m; i++)
    {
        cin>>q[i].x>>q[i].y>>q[i].t;
    }

    sort(q,q+m,cmp);

    Initial();

    for(int i=0; i<m; i++)
    {
        Union(cha(q[i].x),cha(q[i].y));
        if(con==1)
        {
            printf("%d",q[i].t);
            return 0;
        }
    }
    printf("-1\n");
    return 0;
}

本周总结以及一些心得

1.本周主要学习了二叉树,最小堆,堆排序,并查集,sort函数的具体使用,渐渐适应使用C++来编写代码。接下来准备开始学动态规划(主要是为了将云朵那一题做出来,一个上午都在搞这题,结果没有搞出来)

2.本周相较于上周,状态其实差不太多,但是心境变了一些,我竟然可以自主写出来一些简单的题目了(虽然是简单的题目,但是写出来的时候还是很有成就感的),我逐渐意识到我的能力是有限的,能够高效学习的时间相较于其他人来说不长,但是我不能总是和别人去比,每次看到和别人的差距只会让我更加焦虑,因为我本身就有学习的动力,没有必要再通过和别人比较来获得压力进而获得动力,和别人比这样只会让我的学习效率更加的低下。山外有山,天外有天,比是永远比不完的,最重要的就是活在当下,尽量把当下的每一刻活的充实。

3.学习和进步本身就是一件很痛苦的事(写了一个上午还有没有搞出来,这能不痛苦吗?),要改变自己一些不良习惯也是一件很难的事,改变自己的思维,性格是更加难的事(我们思考的方式,和看待事情的角度都是由我们小时候接受的教育有关,从小时候就继承下来的性格很难改变),我能做的只有慢慢来,船到桥头自然直,人到山前自有路,虽然我知道这是在安慰自己,但是我现在能做的就只有慢慢来,完美的结局一般都只出现在小说里面,遗憾才是生活的常态。

4.雕刻自己本身就是一件很痛苦的事(因为时时刻刻都在接受着负反馈,仿佛这个世界都在告诉我,我不行),所以因该包容这种痛苦,而不是想要舍弃。无论最后我能否进入实验室,我都觉得寒假的这段经历是对我有帮助的,因为这是一段在了解自己的过程。浮躁,焦虑,自责这些负能量如果哪天我能包容他们,能够积极的面对生活,我觉得这才算是一种胜利。接纳自己的不足,释怀过去的情感。我们至始至终都是以我们自己的肉体生活,以自己的肉眼看世界,一直活在恐惧中是一件很悲哀的事,我唯一能做的就只是做好自己。无论之后的我会怎样,物品都希望我能够内心柔和平静。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白色的风扇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值