蓝桥杯训练 安慰奶牛 (Kruskal MST)

算法训练 安慰奶牛

时间限制:1.0s   内存限制:256.0MB

问题描述

Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路。道路被用来连接N个牧场,牧场被连续地编号为1到N。每一个牧场都是一个奶牛的家。FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性。你首先要决定那些道路是需要保留的N-1条道路。第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间。没有两个牧场是被一条以上的道路所连接。奶牛们非常伤心,因为她们的交通系统被削减了。你需要到每一个奶牛的住处去安慰她们。每次你到达第i个牧场的时候(即使你已经到过),你必须花去Ci的时间和奶牛交谈。你每个晚上都会在同一个牧场(这是供你选择的)过夜,直到奶牛们都从悲伤中缓过神来。在早上
起来和晚上回去睡觉的时候,你都需要和在你睡觉的牧场的奶牛交谈一次。这样你才能完成你的 交谈任务。假设Farmer John采纳了你的建议,请计算出使所有奶牛都被安慰的最少时间。

输入格式

第1行包含两个整数N和P。

接下来N行,每行包含一个整数Ci。

接下来P行,每行包含三个整数Sj, Ej和Lj。

输出格式

输出一个整数, 所需要的总时间(包含和在你所在的牧场的奶牛的两次谈话时间)。

样例输入

5 7

10

10

20

6

30

1 2 5

2 3 5

2 4 12

3 4 17

2 5 15

3 5 6

样例输出

176

数据规模与约定

5 <= N <= 10000,N-1 <= P <= 100000,0 <= Lj <= 1000,1 <= Ci <= 1,000。

题目链接:http://lx.lanqiao.org/problem.page?gpid=T16

题目分析:题意雷死人了,这个人每天要回到预设起点,也就是说对于除了起点以外的每个点都要遍历它们邻接边个数次,则我们可以将每个点的权值设定为边长*2+边两端点的点权,一开始在起点则起点多谈话一次,因为对于同一棵生成树除了起点外的所有将要遍历的点权边权和是个固定的值,因此只需要取点权最小的点做起点,直接求最小生成树

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const INF = 0x3fffffff;
int const MAXN = 1e4 + 5;
int const MAXM = 1e5 + 5;
int fa[MAXN];
int a[MAXN];
int n, m, ans;

struct EDGE
{
    int x, y;
    int val;
}e[MAXM];

bool cmp(EDGE a, EDGE b)
{
    return a.val < b.val;
}

void UF_set()
{
    for(int i = 0; i < MAXN; i++)
        fa[i] = i;
}

int Find(int x)
{
    return x == fa[x] ? x : fa[x] = Find(fa[x]);
}

void Union(int a, int b)
{
    int r1 = Find(a);
    int r2 = Find(b);
    if(r1 != r2)
        fa[r2] = r1;
}

void Kruskal()
{
    UF_set();
    int cnt = 0;
    for(int i = 0; i < m; i++)
    {
        int x = e[i].x;
        int y = e[i].y;
        if(Find(x) != Find(y))
        {
            Union(x, y);
            ans += e[i].val;
            cnt ++;
        }
        if(cnt >= n)
            break;
    }
}

int main()
{
    ans = 0;
    int mi = INF;
    scanf("%d %d", &n, &m);
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
        mi = min(mi, a[i]);
    }
    for(int i = 0; i < m; i++)
    {
        scanf("%d %d %d", &e[i].x, &e[i].y, &e[i].val);
        e[i].val = e[i].val * 2 + a[e[i].x - 1] + a[e[i].y - 1];
    }
    sort(e, e + m, cmp);
    Kruskal();
    printf("%d\n", ans + mi);
}
时间: 2024-10-23 00:51:25

蓝桥杯训练 安慰奶牛 (Kruskal MST)的相关文章

蓝桥杯试题 算法训练 安慰奶牛

算法训练 安慰奶牛 时间限制:1.0s   内存限制:256.0MB 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性.你首先要决定那些道路是需要保留的N-1条道路.第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间.

33-算法训练 安慰奶牛 - 对象数组排序,对象链表转数组

算法训练 安慰奶牛 时间限制:1.0s   内存限制:256.0MB 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性.你首先要决定那些道路是需要保留的N-1条道路.第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间.

算法训练 安慰奶牛

[原][Usaco Nov08 Gold] 安慰奶牛 2014-5-26阅读159 评论0 Description Farmer John变得非常懒, 他不想再继续维护供奶牛之间供通行的道路. 道路被用来连接N (5 <= N <= 10,000)个牧场, 牧场被连续地编号为1..N. 每一个牧场都是一个奶牛的家. FJ计划除去P(N-1 <= P <= 100,000)条道路中尽可能多的道路, 但是还要保持牧场之间的连通性. 你首先要决定那些道路是需要保留的N-1条道路. 第j条

算法训练 安慰奶牛 最小生成树+构造

http://lx.lanqiao.cn/problem.page?gpid=T16 题意:n个点,p条边,n,p<=1e5.每个点都有权值c[i],求选择一个点出发遍历所有点后返回需要的最小代价? 容易发现 每条边都经历了两次,边(u,v) 第一次达到v时ans+=c[v],v返回u时ans+=c[u] 则构造边为:安慰两个点(u,v)的代价为 2*w+c[u]+c[v],求出MST即可 #include <bits/stdc++.h> using namespace std; con

算法训练 安慰奶牛 &#160; 最小生成树

问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性.你首先要决定那些道路是需要保留的N-1条道路.第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间.没有两个牧场是被一条以上的道路所连接.奶牛们非常伤心,因为她们的交通系

蓝桥杯训练 最短路 (SPFA模板 vector)

算法训练 最短路 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边. 输出格式 共n-1行,第i行表示1号点到i+1号点的最短路. 样例输入 3 3 1 2 -1 2 3 -1 3 1 2 样例输出 -1 -2 数据规模与约定 对于10%的数据,n

蓝桥杯训练 字串统计 (暴力+substr)

算法训练 字串统计 时间限制:1.0s   内存限制:512.0MB 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的. 输入格式 第一行一个数字L. 第二行是字符串S. L大于0,且不超过S的长度. 输出格式 一行,题目要求的字符串. 输入样例1: 4 bbaabbaaaaa 输出样例1: bbaa 输入样例2: 2 bbaabbaaaaa 输出样例2: aa 数据规

蓝桥杯训练中的考新郎问题

题目内容: 国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目, 叫做"考新郎",具体的操作是这样的:首先,给每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排;然后, 让各位新郎寻找自己的新娘.每人只准找一个,并且不允许多人找一个.最后,揭开盖头,如果找错了对象就要当众跪搓 衣板.. 假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能. 输入描述 N M 输出描述 可能的种数 输入样例 3

蓝桥杯训练之ACM

题目内容: 现有长度为n 的字符串,该字符串只由"A","C","M"三种字符组成(可以只有其中一种或两种字符, 但绝对不能有其他字符 ),但是禁止在串中出现C 相邻的情况,求一共有多少种满足要求的不同的字符串. 例如:n=2 时,有AA,AC,AM,CA,CM,MA,MC,MM 8 种情况. 输入描述 长度整数n(n<40) 输出描述 字符串的种数 输入样例 2 输出样例 8 #include<stdio.h> #includ