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. 3 Implementation: The Big Picture 实现:蓝图

    三.Implementation: The Big Picture 实现:蓝图 3.1 Layering of a .NET Solution .Net解决方案的分层 The picture belo ...

  2. pycharm中的terminal和Windows命令提示符有什么区别?二者用pip安装的包是不是位于相同位置?

    那要看pycharm使用了什么shell,可以在设置->工具->终端里查看shell path.如果使用的是cmd.exe那就没区别.pycharm终端和Windows命令提示符用pip安 ...

  3. Coursera Deep Learning笔记 卷积神经网络基础

    参考1 参考2 1. 计算机视觉 使用传统神经网络处理机器视觉的一个主要问题是输入层维度很大.例如一张64x64x3的图片,神经网络输入层的维度为12288. 如果图片尺寸较大,例如一张1000x10 ...

  4. kivy Label触发事件

    kivy  label也可以触发事件,为什么只有我这么无聊学垃圾kivy """ 在通过ref标记一段文本后点击这段文本就可以触发'on_ref_press'事件,在该事 ...

  5. 需求存在,功能存在——Alpha阶段性总结

    0.Alpha开发成果 题士Alpha发布报告 题士开发记录 1.任务划分 Alpha阶段大致将任务划分为Design,Develop和Test三类 Design型任务包含页面UI设计和接口API设计 ...

  6. Spring Cloud Gateway Route Predicate Factory 的使用

    Spring Cloud Gateway的使用 一.需求 二.基本组成 1.简介 2.核型概念 1.Route 路由 2.Predicate 谓语.断言 3.Filter 过滤器 3.工作原理 三.网 ...

  7. 零基础入门C/C++实现你的浪漫表白:浪漫流星雨表白程序

    想要讨女朋友欢心也巩固自己所学的知识,各位小伙伴有自己的想法了吗?准备好想要怎样实施了吗?有什么美好的计划了吗?如果没有的话那么别慌,我知道,在座的各位肯定都是有自己的心仪的姑娘,那么今天就教大家一招 ...

  8. 算法:九宫格问题--奇数阶魔方(Magic-Square)

    一.魔方介绍 魔方(这里是简称,也可以叫幻方.魔术矩阵,Magic Square)是 n×n 正方形网格(n 为每侧的单元数),里面每个单元格填充了不同的正整数 1, 2, 3, ... , n2,并 ...

  9. OKhttp3的使用教程

    首先在build.gradle下的dependencies下添加引用. implementation "com.squareup.okhttp3:okhttp:4.9.0" 然后编 ...

  10. Manacher算法 求 最长回文子串

    1 概述(扯淡) 在了解Manacher算法之前,我们得先知道什么是回文串和子串. 回文串,就是正着看反着看都一样的字符串.比如说"abba"就是一个回文串,"abbc& ...