题解 P6004 【[USACO20JAN]Wormhole Sort S】
这题真的是非常标准的模板题啊
看到连最少的边,第一时间会想到 \(kruskal\) .这道题的难点其实就一个:你要注意到连边权最大的边使整个图联通
为什么:题意是第i个点想走到 \(pos[i]\) ,也就是说点i和点 \(pos[i]\) 必须要联通.
为什么想不到 \(kruskal\) :因为 \(kruskal\) 是最小生成树,比较难想到两条边权大的边连起来并不会影响最小权值.
扯远了进入正题:
1.怎么保证连的边的权值最大:
将边权从大到小排列,需要拿的边尽量拿(因为并不会影响最小权值).
2.怎么查两点是否连通:
这个是 \(kruskal\) 算法最基本的要领.如果一个点的父亲 \(fat[i]\) 等于另外一个点的父亲 \(fat[j]\), 那么我们可以确定这两点连通
3.要连什么点
细心观察会发现,第i个点走到 \(pos[i]\) 可以转化为点i和点 \(pos[i]\) 连通.
4.怎么判断什么时候全图连通:
因为要求是一定要全部连通才行,所以如果有一个点不连通,后面怎么连通都没用.而如果有一个点连通了,就算后面再怎么连,最后这个点仍然连通.所以,我们可以做一个指针.指针从1开始,表示第一个不连通的点.每次连边之前先确定还有哪条边不连通.如果我们发现连通的点数已经大于总的点数,那么答案就是输出了
上代码:(124ms吊打目前所有解法)
#include <iostream>
#include <algorithm>
using namespace std;
inline int read() {
int x=0,w=1;
char ch;
while(ch<'0'||ch>'9')
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*w;
}
int n,m,pos[100005],tot = 0,fat[100005], ans = -1;
struct Edge{
int from,to,dis;
}edge[300005];
int father(int x){
while(x!=fat[x]) x=fat[x]=fat[fat[x]];//这个是kruskal的一个加速方法,在查自己的时候可以直接更新父亲
return x;
}
void Union(int x, int y){
fat[father(y)] = father(x);
}
void add(int f, int t, int d){
edge[++tot].from = f;
edge[tot].to = t;
edge[tot].dis = d;
}
//不解释
bool sorted(Edge a, Edge b){
return a.dis>b.dis;//从大到小排列
}
int main(){
n = read();m = read();
for (int i=1;i<=n;i++) pos[i] = read();
for (int i=0;i<m;i++){
int a,b,c;
a = read();b = read(); c = read();
add(a,b,c);//连边
}
sort(edge+1,edge+tot+1,sorted);//从大到小排列
int ptr = 1;
for (int i=1;i<=n;i++) fat[i] = i;//自己爸爸一开始就是自己
for (int i=1;i<=tot;i++){
while(father(ptr)==father(pos[ptr])) {ptr++; if (ptr>n) goto abcd;}//当我爸跟他爸是同一个人就增加,直到我跟他都不存在或者我爸不是他爸
if (father(pos[edge[i].from])!=father(pos[edge[i].to])){
Union(pos[edge[i].from],pos[edge[i].to]);//如果他爸不是我爸,那我将我爸设成他爸
ans = edge[i].dis;//答案就是现在的边权
}
}
abcd:;
printf("%d",ans);
}
题解 P6004 【[USACO20JAN]Wormhole Sort S】的更多相关文章
- 算法与数据结构基础 - 排序(Sort)
排序基础 排序方法分两大类,一类是比较排序,快速排序(Quick Sort).归并排序(Merge Sort).插入排序(Insertion Sort).选择排序(Selection Sort).希尔 ...
- poj2785双向搜索
The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute ...
- LeetCode Minimum Time Difference
原题链接在这里:https://leetcode.com/problems/minimum-time-difference/description/ 题目: Given a list of 24-ho ...
- LeetCode Relative Ranks
原题链接在这里:https://leetcode.com/problems/relative-ranks/#/description 题目: Given scores of N athletes, f ...
- 华中农业大学第四届程序设计大赛网络同步赛 J
Problem J: Arithmetic Sequence Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1766 Solved: 299[Subm ...
- [BZOJ3555] [Ctsc2014]企鹅QQ(Hash)
传送门 可以枚举被删除的位置,然后用hash表判重,然而网上好多题解都是用 sort 判重的. 不知道为什么,int 总是过不了,换成 long long 或者是 unsigned long long ...
- Codefoces 828C
C. String Reconstruction time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- 算法与数据结构基础 - 广度优先搜索(BFS)
BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...
- CF - 1108 F MST Unification
题目传送门 题意:在一幅图中, 问需要使得多少条边加一,使得最小生成树只有一种方案. 题解:Kruskal, sort完之后,对于相通的一个边权w,我们可以分析出来有多少边是可以被放到图里面的,然后我 ...
随机推荐
- POJ 2104 求序列里第K大 主席树裸题
给定一个n的序列,有m个询问 每次询问求l-r 里面第k大的数字是什么 只有询问,没有修改 可以用归并树和划分树(我都没学过..囧) 我是专门冲着弄主席树来的 对主席树的建树方式有点了解了,不过这题为 ...
- 腾讯云Windows2016数据中文版环境搭建
最近忙活了好几天,在腾讯云上买了台服务器,系统是Windows2016数据中文版,用于个人的学习,下面说一下整个流程吧. 遇到的问题: 一开始是按照腾讯云的指南文档去搞环境配置的,但它上面都是以Win ...
- 人人嫌丑的iPhoneX刘海屏为何会被手机厂商竞相模仿
不得不提到的是,苹果的iPhone自发布以来就始终引领着智能手机发展的方向.比如iPhone一代出现之后,就慢慢将键盘手机赶下历史舞台,让触屏手机成为主流.此外,iPhone的指纹识别.金属机身.玻璃 ...
- 19 01 17 Django 模板 返回一个页面
模板 问题 如何向请求者返回一个漂亮的页面呢? 肯定需要用到html.css,如果想要更炫的效果还要加入js,问题来了,这么一堆字段串全都写到视图中,作为HttpResponse()的参数吗?这样定义 ...
- filebeat+redis+logstash+elasticsearch基本配置--适用于6.4版本
filebeat配置: filebeat.inputs:- type: log enabled: true paths: - /opt/xxxx.log fields: ...
- BZOJ:2242: [SDOI2011]计算器
题解:BSGS 问题:map空间 BSGS判无解 a%p!=0 0与最小非负整数 有区别 函数传参类型转换int->long long long long ->int; 费马小定理充分必要 ...
- Python Learning Day6
selenium操作 点击.清除操作 from selenium import webdriver from selenium.webdriver.common.keys import Keys im ...
- /Array.CreateInstance创建类型为int,长度为5的数组
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...
- [NOIP2009普及]分数线划定 T2 排序
Description 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试.面试分数线根据计划录取人数的 ...
- Nim游戏(尼姆博弈)
这里是尼姆博弈的模板,前面的博弈问题的博客里也有,这里单列出来. 有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A B都非 ...