洛谷 [P3623] 免费道路
有 k 条特殊边的生成树
我们发现有一些边是必须的,如果把所有的水泥路都加入并查集,再枚举鹅卵石路,如果这条路能再次加入并查集,说明这条路是必须的
水泥路同样
这样就把必需边求出来了,剩下就可以随意加边了
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 100005;
int init() {
int rv = 0, fh = 1;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') fh = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
rv = (rv<<1) + (rv<<3) + c - '0';
c = getchar();
}
return fh * rv;
}
int n, m, nume, head[MAXN], fa[MAXN], k, cnt, ans[MAXN], ind;
struct edge{
int to, nxt, opt;
}e[MAXN << 1];
void adde(int from, int to, int opt) {
e[++nume].to = to;
e[nume].nxt = head[from];
head[from] = nume;
e[nume].opt = opt;
}
int find(int x) {
if(x != fa[x]) return fa[x] = find(fa[x]);
return fa[x];
}
void merge(int x, int y) {
int r1 = find(x), r2 = find(y);
if(r1 != r2) {
fa[r1] = r2;
}
}
void input() {
for(int i = 1; i <= n; i++) fa[i] = i;
}
bool chk() {
for(int i = 2; i <= n; i++) if(find(i) != find(1)) return 0;
return 1;
}
int main() {
n = init(); m = init(); k = init();
input();
for(int i = 1; i <= m; i++) {
int u = init(), v = init(), opt = init();
adde(u, v, opt); adde(v, u, opt);
if(opt == 1) merge(u, v);
}
for(int i = 1; i <= m * 2; i += 2) {
if(e[i].opt == 0) {
int r1 = find(e[i].to), r2 = find(e[((i - 1) ^ 1) + 1].to);
if(r1 != r2) {
fa[r1] = r2;
ans[++cnt] = i;
ind++;
}
}
}
if(cnt > k || !chk()) {
printf("no solution\n");
return 0;
}
input();
for(int i = 1; i <= nume; i += 2) {
if(e[i].opt == 0) merge(e[i].to, e[((i - 1) ^ 1) + 1].to);
}
for(int i = 1; i <= m * 2; i += 2) {
if(e[i].opt == 1) {
int r1 = find(e[i].to), r2 = find(e[((i - 1) ^ 1) + 1].to);
if(r1 != r2) {
fa[r1] = r2;
ans[++cnt] = i;
}
}
}
if(!chk()) {
printf("no solution\n");
return 0;
}
input();
for(int i = 1; i <= cnt; i++) {
int t = ans[i];
merge(e[t].to, e[((t - 1) ^ 1) + 1].to);
}
for(int i = 1; i <= nume; i += 2) {
if(ind == k) break;
if(e[i].opt == 0) {
int r1 = find(e[i].to), r2 = find(e[((i - 1) ^ 1) + 1].to);
if(r1 != r2) {
fa[r1] = r2;
ans[++cnt] = i;
ind++;
}
}
}
if(ind != k) {
printf("no solution\n");
return 0;
}
for(int i = 1; i <= nume; i += 2) {
if(e[i].opt == 1) {
int r1 = find(e[i].to), r2 = find(e[((i - 1) ^ 1) + 1].to);
if(r1 != r2) {
fa[r1] = r2;
ans[++cnt] = i;
}
}
}
sort(ans + 1, ans + cnt + 1);
for(int i = 1 ; i <= cnt; i++) {
int t = ans[i];
printf("%d %d %d\n", e[((t - 1) ^ 1) + 1].to, e[t].to, e[t].opt);
}
return 0;
}
洛谷 [P3623] 免费道路的更多相关文章
- 洛谷 P5019 铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...
- [NOIP2014] 提高组 洛谷P2296 寻找道路
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- NOIP2014 day2 T2 洛谷P2296 寻找道路
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- 洛谷 P1272 重建道路 解题报告
P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...
- 洛谷 P2505 [HAOI2012]道路 解题报告
P2505 [HAOI2012]道路 题目描述 C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它 ...
- 洛谷P3639 [APIO2013] 道路费用 [生成树的特殊算法]
题目传送门 道路费用 格式难调,题面就不放了. 分析: 这是一道要细(yan)心(jing)的生成树的好(gui)题. 首先我们看到$k$的范围非常小,那么我们就可以直接$2^k$枚举每一条加边是否选 ...
- 洛谷P2296 寻找道路 [拓扑排序,最短路]
题目传送门 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- 洛谷——P1907 设计道路
P1907 设计道路 题目描述 Caesar远征高卢回来后,对你大加赞赏,他亲自来到Genoa视察. Genoa在你的建设下变得无比繁荣,由于财政收入的增加,你为城市修建了交通系统.古罗马的交通系统由 ...
- 洛谷P2052 [NOI2011]道路修建(树形DP)
题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1 条双向道路. 每条道 ...
随机推荐
- Linux磁盘I/O性能监控——iostat
iostat命令可以查看CPU利用率和磁盘性能相关数据,有时候我们会觉得系统响应慢,传数据很慢,这个慢可能是多方面原因导致的,如CPU利用率高.网络差.系统平均负载高甚至是磁盘已经损坏了.对此,系统性 ...
- 第17题:打印1到最大的n位数
面试题17:打印1到最大的n位数 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 考点: 用字符串或者数组表达一个大数. 思路 1. ...
- (78)zabbix值缓存(value cache)说明
在zabbix-2.2版本之前,zabbix计算trigger与calculated/aggregate值都是直接通过sql语句查询并处理出来的结果,为了提高这块的性能与效率,zabbix引入了val ...
- 项目实战2.3-Nginx的“远方表哥”—Tengine
本文收录在Linux运维企业架构实战系列 今天想起当初研究nginx反向代理负载均衡时,nginx自身的upstream后端配置用着非常不舒服: 当时使用的淘宝基于nginx二次开发的Tengine, ...
- Shell脚本使用汇总整理——文件夹及子文件备份脚本
Shell脚本使用汇总整理——文件夹及子文件备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/9223477.html ...
- 用纯CSS实现加载中动画效果
HTML <div class="pswp__preloader__icn"> <div class="pswp__preloader__cut&quo ...
- centos7安装phpstudy
操作系统:CentOS 7 x86_64 SSH登录工具:FinalSHell 2.9.7 一.安装phpstudy 1.下载完整版: wget -c http://lamp.phpstudy.net ...
- (转)RubyGems常用命令
什么是RubyGems? RubyGems是一个方便而强大的Ruby程序包管理器,Ruby的第三方插件是用gem方式来管理,非常容易发布和共享,一个简单的命令就可以安装上第三方的扩展库.特点:能远程安 ...
- Android 适配器 自定义
前言:最近看了几个开源项目,发现适配器这东西用的很多,一开始觉得这东西高大上,其实呢,感觉就是一个中转站,或者说是一个接口工具,将数据填充到一个视图中,几乎任何项目都会涉及到.所以今天也简单看了一下, ...
- 15、响应式布局和BootStrap 全局CSS样式知识点总结-part2
1.表格 <div class="container"> <table class="table "> <thead> &l ...