[ABC270F] Transportation
[ABC270F] Transportation
题意
有 \(n\) 个点,有 \(m\) 条可以加上的边,如果两个点同时建立了一种东西,那么也算连了一条边,每条边都有个代价,每个点建一个东西也有不同的代价,问想要让图连通,最少需要多少代价。
思路
显然是最小生成树,但是由于可以见两种东西,所以比较难处理,所以可以将这个点权变成一条边,这样就好处理了,所以可以额外开两个点 \(n + 1\) 和 \(n + 2\),可以将所有点的两种建东西的代价作为边权连向它们,但可以不建东西,所以做四次最小生成树即可。
代码
#include <algorithm>
#include <iostream>
using namespace std;
const int MaxN = 2e5 + 10;
struct S {
int u, v, w;
bool operator<(const S &j) const {
return w < j.w;
}
} a[MaxN + 2 * MaxN];
int n, m, tot;
long long fa[MaxN], ans = 1e18;
bool vis[MaxN];
int FindFather(int x) {
return fa[x] < 0 ? x : fa[x] = FindFather(fa[x]);
}
void insert(int x, int y) {
x = FindFather(x), y = FindFather(y);
if (fa[x] < fa[y]) {
swap(x, y);
}
fa[y] += fa[x], fa[x] = y;
}
int main() {
cin >> n >> m;
for (int i = 1, u; i <= n; i++) {
cin >> u;
a[++tot] = {i, n + 1, u};
}
for (int i = 1, u; i <= n; i++) {
cin >> u;
a[++tot] = {i, n + 2, u};
}
for (int i = 1, u, v, w; i <= m; i++) {
cin >> u >> v >> w;
a[++tot] = {u, v, w};
}
sort(a + 1, a + tot + 1);
for (int u = 0; u < 4; u++) {
fill(fa + 1, fa + n + 4, -1);
fill(vis + 1, vis + n + 4, 0);
long long sum = 0;
for (int i = 1; i <= tot; i++) {
if ((a[i].v == n + 1 && ((u >> 1) & 1) != 1) || (a[i].v == n + 2 && (u & 1) != 1)) {
continue;
}
if (FindFather(a[i].u) != FindFather(a[i].v)) {
sum += a[i].w, vis[a[i].u] = vis[a[i].v] = 1;
insert(a[i].u, a[i].v);
}
}
int cnt = 0;
for (int i = 1; i <= n + 4; i++) {
cnt += vis[i];
}
if (u == 0) {
if (cnt != n) {
sum = 1e18;
}
} else if (u == 1 || u == 2) {
if (cnt != n + 1) {
sum = 1e18;
}
} else if (u == 3) {
if (cnt != n + 2) {
sum = 1e18;
}
}
ans = min(ans, sum);
}
cout << ans << endl;
return 0;
}
[ABC270F] Transportation的更多相关文章
- POJ 1797 Heavy Transportation(最大生成树/最短路变形)
传送门 Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 31882 Accept ...
- 【HDU 4940】Destroy Transportation system(无源无汇带上下界可行流)
Description Tom is a commander, his task is destroying his enemy’s transportation system. Let’s repr ...
- Heavy Transportation(最短路 + dp)
Heavy Transportation Time Limit:3000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64 ...
- POJ 1797 Heavy Transportation (Dijkstra变形)
F - Heavy Transportation Time Limit:3000MS Memory Limit:30000KB 64bit IO Format:%I64d & ...
- poj 1797 Heavy Transportation(最短路径Dijkdtra)
Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 26968 Accepted: ...
- POJ 1797 Heavy Transportation
题目链接:http://poj.org/problem?id=1797 Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K T ...
- uva301 - Transportation
Transportation Ruratania is just entering capitalism and is establishing new enterprising activiti ...
- POJ 1797 Heavy Transportation (最短路)
Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 22440 Accepted: ...
- POJ 1797 Heavy Transportation (dijkstra 最小边最大)
Heavy Transportation 题目链接: http://acm.hust.edu.cn/vjudge/contest/66569#problem/A Description Backgro ...
- TOJ3744(Transportation Costs)
Transportation Costs Time Limit(Common/Java):2000MS/6000MS Memory Limit:65536KByte Total Submi ...
随机推荐
- 使用 Agora 为Android APP添加视频直播
add-live-streaming-to-your-android-app-using-agora-featured1024×512 121 KB 视频互动直播是当前比较热门的玩法,我们经常见到有P ...
- 声网 X 远程超声:实时音视频解决基层“看病难” 推动医疗资源均衡化
实时互联网像触角一样,通过情景的共享延伸开来,链接着我们彼此的线下.线上生活,形成一张不可分割的网络.随着社交直播.在线教育.视频会议成为大众生活不可或缺的一部分的同时,智能手表.智能作业灯.视频双录 ...
- 浅谈云原生基础入坑与docker 搭建redis-cluster集群
浅谈云原生基础入坑与docker 搭建redis-cluster集群 开篇来点自己的小感触:自从走上后端开发这条无法回头的互卷道路以后,在视野内可见新的技术在迭代,更新的技术在不断发行.就拿最近的Op ...
- Netty 高性能之零拷贝
更多内容,前往个人博客 零拷贝是指避免在用户态(User-space)与内核态(Kernel-space)之间来回拷贝数据的技术. 一.传统 IO 传统 IO(InputStream/OutputSt ...
- JVM——锁
对象头[每个对象都具有对象头] Mark:对象头的标记(32位),描述对象的 hash.锁信息.垃圾回收标记.年龄:内容包括:①.指向锁记录的指针:②.指向 monitor 的指针:③.GC 标记:④ ...
- flex布局相关属性记录
<template> <div class="about"> <h3>flex相关的属性</h3> <div class=&q ...
- GitHub+Typora实现云笔记一键上传
git实现笔记自动上传功能 简介: 将更新内容自动上传同步git,无需手动提交,解锁一键式同步.流程大致为,创建新仓库,配置公钥和私钥,安装quicker软件,通过quicker上某脚本完成一键提交. ...
- Java BIO,NIO,AIO
一丶IO模型&Java IO Unix为程序员提供了以下5种基本的io模型: blocking io: 阻塞io nonblocking io: 非阻塞io I/O multiplexing: ...
- tidyr包几个函数的用法
在R语言中,tidyr主要提供了一个类似Excel中数据透视表 (pivottable)的功能; gather和spread函数将数据在长格式和宽格式之间相互转化,应用在比如稀疏矩阵和稠密矩阵之间的转 ...
- PDF打开后显示的名称不是其文件名怎么办?
本文介绍打开PDF文件时,PDF阅读器所显示的文件名称与文件实际名称不一致的解决办法. 就在刚刚准备一篇空间三维建模相关的博客时,偶然发现了如下一个问题: 在打开这个图中名称为空间三维建模 ...