Description

  约翰农场的牛群希望能够在 N 个(1<=N<=6000) 草地之间任意移动。草地的编号由 1到 N。草地之间有树林隔开。牛群希望能够选择草地间的路径,使牛群能够从任一 片草地移动到任一片其它草地。 牛群可在路径上双向通行。
  牛群并不能创造路径,但是他们会保有及利用已经发现的野兽所走出来的路径(以
下简称兽径)。每星期他们会选择并管理一些或全部已知的兽径当作通路。
  牛群每星期初会发现一条新的兽径。他们接着必须决定管理哪些兽径来组成该周牛
群移动的通路,使得牛群得以从任一草地移动到任一草地。牛群只能使用当周有被 管理的兽径做为通路。

  牛群希望他们管理的兽径长度和为最小。牛群可以从所有他们知道的所有兽径中挑 选出一些来管理。牛群可以挑选的兽径与它之前是否曾被管理无关。

  兽径决不会是直线,因此连接两片草地之间的不同兽径长度可以不同。 此外虽然 两条兽径或许会相交,但牛群非常的专注,除非交点是在草地内,否则不会在交点
换到另外一条兽径上。
  在每周开始的时候,牛群会描述他们新发现的兽径。如果可能的话,请找出可从任
何一草地通达另一草地的一组需管理的兽径,使其兽径长度和最小。

Input

输入的第一行包含两个用空白分开的整数 N 和 W。W 代表你的程序需要处理
的周数. (1 <= W <= 6000)。
以下每处理一周,读入一行数据,代表该周新发现的兽径,由三个以空白分开
的整数分别代表该兽径的两个端点 (两片草地的编号) 与该兽径的长度(1…10000)。一条兽径的两个端点一定不同。

Output

每次读入新发现的兽径后,你的程序必须立刻输出一组兽径的长度和,此组兽径可从任何一草地通达另一草地,并使兽径长度和最小。如果不能找到一组可从任一草地通达另一草地的兽径,则输出
“-1”。

Sample Input

4 6
1 2 10
1 3 8
3 2 3
1 4 3
1 3 6
2 1 2

Sample Output

-1
-1
-1
14
12
8

Hint

样例说明

依题意可以看出题目的意思大概是在每天都求一颗最小生成树 因为给定的边而且并不稠密 明显使用Kruskal

我们考虑最简单的做法

每天都读入一条边 + Kruskal的模板

但这样明显复杂度送我们上天

我们考虑复杂度过高的原因是 每次求最小生成树 都进行了sort操作 我们思考是否能够只进行一次sort

题目没有要求在线解答 我们可以读入所有边 并打上时间标记

在Kruskal的遍历边时加上时间是否达到这一条件

贴代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#define LL long long
#define M 6010
#define f(i,a,b) for(long long i = (a); i <= (b) ; i++)
using namespace std;
inline long long read()
{
char C = getchar();
while((C < '0' || C > '9') && C != '-') C = getchar();
long long F = 1, N = 0 ;
if( C == '-') F = -1, C = getchar();
while(C >= '0' && C <= '9') N = (N << 1) + (N << 3) + (C - 48),C = getchar();
return F*N;
}
struct QWQ
{
long long x,y,z,t;
bool operator < (const QWQ&QAQ) const
{
return QAQ.z > z;
}
}edge[M];
long long n,w,num,ans,fa[M];
long long get(long long x)
{
if(fa[x] == x)
return x;
return fa[x] = get(fa[x]);
}
void merge(long long x,long long y)
{
fa[x] = y;
}
int main()
{
scanf("%lld%lld",&n,&w);
f(i,1,w)
{
edge[i].x = read();
edge[i].y = read();
edge[i].z = read();
edge[i].t = i;
}
sort(edge + 1,edge + 1 + w);
f(i,1,n) fa[i] = i;
f(i,1,w)
{
ans = num = 0;
f(i,1,n) fa[i] = i;
for(long long j = 1; j <= w && num < n - 1; j++)
{
if (edge[j].t <= i)
{
long long left = edge[j].x;
long long right = edge[j].y;
long long left_fa = get(left);
long long right_fa = get(right);
if(left_fa != right_fa)
{
merge(left_fa,right_fa);
ans += edge[j].z;
num++;
}
}
}
if(num != n - 1)
cout << -1 <<endl;
else
cout << ans <<endl;
}
}

【洛谷1340】兽径管理(最小生成树 Kruskal)(sort的一些技巧)【2012福建省信息学奥林匹克CCF NOIP夏令营第05天训练】的更多相关文章

  1. 洛谷 P1340 兽径管理

    题目描述 约翰农场的牛群希望能够在 N 个(1<=N<=200) 草地之间任意移动.草地的编号由 1到 N.草地之间有树林隔开.牛群希望能够选择草地间的路径,使牛群能够从任一 片草地移动到 ...

  2. 2021.08.05 P1340 兽径管理(最小生成树)

    2021.08.05 P1340 兽径管理(最小生成树) P1340 兽径管理 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.离线化. 题意: 有n个点,m条边,每次加 ...

  3. 洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题

    链接 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M&l ...

  4. 最小生成树 & 洛谷P3366【模板】最小生成树 & 洛谷P2820 局域网

    嗯... 理解生成树的概念: 在一幅图中将所有n个点连接起来的n-1条边所形成的树. 最小生成树: 边权之和最小的生成树. 最小瓶颈生成树: 对于带权图,最大权值最小的生成树. 如何操作? 1.Pri ...

  5. P1340 兽径管理 洛谷

    https://www.luogu.org/problem/show?pid=1340 题目描述 约翰农场的牛群希望能够在 N 个(1<=N<=200) 草地之间任意移动.草地的编号由 1 ...

  6. luogu P1340 兽径管理

    题目描述 约翰农场的牛群希望能够在 N 个(1<=N<=200) 草地之间任意移动.草地的编号由 1到 N.草地之间有树林隔开.牛群希望能够选择草地间的路径,使牛群能够从任一 片草地移动到 ...

  7. 【u015】兽径管理

    [问题描述] 约翰农场的牛群希望能够在 N 个(1<=N<=200)草地之间任意移动.草地的编号由 1到N.草地之间有树林隔开.牛群希望能够选择草地间的路径,使牛群能够从任一 片草地移动到 ...

  8. 【洛谷P1318积水面积】最小生成树

    我写一篇绝对原创的题解,算法原创,求洛谷通过!!!(让更多人看到这篇题解) 绝大多数人肯定认为这道题是一道模拟题 以下为正解 我们来看一下这一道题,其实就是找到左右高点,在模拟. 但是这个是正常人的想 ...

  9. 洛谷.4172.[WC2006]水管局长(LCT Kruskal)

    题目链接 洛谷(COGS上也有) 不想去做加强版了..(其实处理一下矩阵就好了) 题意: 有一张图,求一条x->y的路径,使得路径上最长边尽量短并输出它的长度.会有<=5000次删边. 这 ...

随机推荐

  1. Kubernetes-Service介绍(三)-Ingress(含最新版安装踩坑实践)

    前言 本篇是Kubernetes第十篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战. Kubernetes系列文章: Kubernetes介绍 Kubernetes环境搭建 Kuberne ...

  2. webpack基础以及webpack中babel的配置

    webpack 安装 npm 初始化,控制台输入 npm init -y webpack 安装 npm i webpack webpack-cli -D 新建 webpack.config.js co ...

  3. 计算机网络之传输层UDP协议

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105453096 学习课程:<2019王道考研计算机网络> 学习目的 ...

  4. 【做题记录】CF1428E Carrots for Rabbits—堆的妙用

    CF1428E Carrots for Rabbits 题意: 有 \(n\) 个萝卜,每个萝卜的初始大小为 \(a_i\) .现在要把这些萝卜切为为 \(k\) 个.吃每一个萝卜的时间为这个萝卜的大 ...

  5. 决策树 机器学习,西瓜书p80 表4.2 使用信息增益生成决策树及后剪枝

    使用信息增益构造决策树,完成后剪枝 目录 使用信息增益构造决策树,完成后剪枝 1 构造决策树 1 根结点的选择 色泽 信息增益 根蒂 信息增益 敲声 信息增益 纹理 信息增益 脐部 信息增益 触感 信 ...

  6. linked-list-cycle-ii leetcode C++

    Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull. Follo ...

  7. oracle 归档日志:db_recovery_file_dest、log_archive_dest和log_archive_dest_n的区别和使用

    概念: db_recovery_file_dest:默认的指定闪回恢复区路径 log_archive_dest:指定归档文件存放的路径,所有归档路径必须是本地的,默认为''.log_archive_d ...

  8. Connected to an idle instance.

    Connected to an idle instance:连接到空闲实例 原因:数据库或者监听没启动

  9. 开源的分布式事务框架 springcloud Alibaba Seata 的搭建使用 一次把坑踩完。。。

    seata的使用 1. Seata 概述 Seata 是 Simple Extensible Autonomous Transaction Architecture 的简写,由 feascar 改名而 ...

  10. robot_framewok自动化测试--(4)常用关键字介绍

    常用关键字介绍 在学习一门编程语言的时候,大多教材都是从打印"hello world"开始.我们可以像编程语言一样来学习 Robot Framework.虽然通过 RIDE 提供& ...