Codeforces Round #212 (Div. 2) D. Fools and Foolproof Roads 并查集+优先队列
You must have heard all about the Foolland on your Geography lessons. Specifically, you must know that federal structure of this country has been the same for many centuries. The country consists of n cities, some pairs of cities are connected by bidirectional roads, each road is described by its length li.
The fools lived in their land joyfully, but a recent revolution changed the king. Now the king is Vasily the Bear. Vasily divided the country cities into regions, so that any two cities of the same region have a path along the roads between them and any two cities of different regions don't have such path. Then Vasily decided to upgrade the road network and construct exactly p new roads in the country. Constructing a road goes like this:
- We choose a pair of distinct cities u, v that will be connected by a new road (at that, it is possible that there already is a road between these cities).
- We define the length of the new road: if cities u, v belong to distinct regions, then the length is calculated as min(109, S + 1) (S — the total length of all roads that exist in the linked regions), otherwise we assume that the length equals 1000.
- We build a road of the specified length between the chosen cities. If the new road connects two distinct regions, after construction of the road these regions are combined into one new region.
Vasily wants the road constructing process to result in the country that consists exactly of q regions. Your task is to come up with such road constructing plan for Vasily that it meets the requirement and minimizes the total length of the built roads.
The first line contains four integers n (1 ≤ n ≤ 105), m (0 ≤ m ≤ 105), p (0 ≤ p ≤ 105), q (1 ≤ q ≤ n) — the number of cities in the Foolland, the number of existing roads, the number of roads that are planned to construct and the required number of regions.
Next m lines describe the roads that exist by the moment upgrading of the roads begun. Each of these lines contains three integers xi,yi, li: xi, yi — the numbers of the cities connected by this road (1 ≤ xi, yi ≤ n, xi ≠ yi), li — length of the road (1 ≤ li ≤ 109). Note that one pair of cities can be connected with multiple roads.
If constructing the roads in the required way is impossible, print a single string "NO" (without the quotes). Otherwise, in the first line print word "YES" (without the quotes), and in the next p lines print the road construction plan. Each line of the plan must consist of two distinct integers, giving the numbers of the cities connected by a road. The road must occur in the plan in the order they need to be constructed. If there are multiple optimal solutions, you can print any of them.
9 6 2 2
1 2 2
3 2 1
4 6 20
1 3 8
7 8 3
5 7 2
YES
9 5
1 9
Consider the first sample. Before the reform the Foolland consists of four regions. The first region includes cities 1, 2, 3, the second region has cities 4 and 6, the third region has cities 5, 7, 8, the fourth region has city 9. The total length of the roads in these cities is11, 20, 5 and 0, correspondingly. According to the plan, we first build the road of length 6 between cities 5 and 9, then the road of length 23 between cities 1 and 9. Thus, the total length of the built roads equals 29.
题意:
给你n点m边的无向图;
你可以加入p条任意边,而使得新图是由q个联通快构成的无向图
加边规则如下;
你可以选择两个不同点 相连,无论原来他们是否有边
你可以选择两个不同点相连,如果他们是不属于同一个联通快,那么新加入的边 的边权必须为 min(1e9,S+1),S表示 这两个联通快的 总边权和
如果他们属于一个联通快,那么新加入的边 边权必须 为1000
相连之后,就属于一个联通快了
是否有方案构成q块
并且使得新加边的总边权最小
题解:
并查集维护联通快与边权和
优先队列每次选择联通快和最小的两个相连
最后多余的边都连在同样的两个点上就好了
#include<bits/stdc++.h>
#include<queue>
using namespace std;
#define ls i<<1
#define rs ls | 1
#define mid ((ll+rr)>>1)
#define pii pair<int,int>
#define MP make_pair
typedef long long LL;
const long long INF = 1e18;
const double Pi = acos(-1.0);
const int N = 3e5+, M = 2e5++, mod = 1e9+, inf = 0x3fffffff; int n,m,p,q,edges[N],fa[N],num[N],a[N],vis[N];
vector<pii > ans;
LL sum[N];
int finds(int x) {return fa[x] == x? x:fa[x]=finds(fa[x]);}
struct node{LL value;int id;
bool operator < (const node &r) const
{
return value > r.value;
}
};
int main() {
scanf("%d%d%d%d",&n,&m,&p,&q);
for(int i = ; i <= n; ++i) fa[i] = i,sum[i] = , num[i] = ;
for(int i = ; i <= m; ++i) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
int fx = finds(u);
int fy = finds(v);
sum[fx] += w;
if(fx!=fy) {
num[fx] += num[fy];
fa[fy] = fx;
sum[fx] += sum[fy];
}
}
priority_queue<node> Q;
int block = ;
for(int i = ; i <= n; ++i) {
int fx = finds(i);
if(!vis[fx]) {
Q.push(node{sum[fx],fx});
// cout<<sum[fx]<<" "<<fx<<endl;
block++;
vis[fx] = ;
}
}
block = block - q;
if(block < ) {
puts("NO");
return ;
}
while(!Q.empty() && block--) {
node k = Q.top();
Q.pop();
if(Q.empty()) {break;}
node k2 = Q.top();
Q.pop();
// cout<<k.id<<" "<<k2.id<<endl;
ans.push_back(MP(k.id,k2.id));
num[k.id] += num[k2.id];
fa[k2.id] = fa[k.id];
Q.push(node{k.value+k2.value+min(1000000000LL,k.value+k2.value+),k.id});
p--;
}
if(p < ) {
puts("NO");
return ;
}
if(p) {
int flag = -;
for(int i = ; i <= n; ++i) {
int fx = finds(i);
if(num[fx]>) {
flag = fx;
// cout<<fx<<endl;
break;
}
} for(int cnt = ,i = ; i <= n; ++i) {
if(finds(i) == flag) {
a[++cnt] = i;
}
if(cnt == ) break;
}
if(flag == -) {
puts("NO");return ;
}
while(p--) {
ans.push_back(MP(a[],a[]));
}
}
puts("YES");
for(int i = ; i < ans.size(); ++i) cout<<ans[i].first<<" "<<ans[i].second<<endl;
return ;
}
Codeforces Round #212 (Div. 2) D. Fools and Foolproof Roads 并查集+优先队列的更多相关文章
- Codeforces Round #396 (Div. 2) D. Mahmoud and a Dictionary 并查集
D. Mahmoud and a Dictionary 题目连接: http://codeforces.com/contest/766/problem/D Description Mahmoud wa ...
- Codeforces Round #250 (Div. 1) B. The Child and Zoo 并查集
B. The Child and Zoo Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/438/ ...
- Codeforces Round #360 (Div. 1) D. Dividing Kingdom II 暴力并查集
D. Dividing Kingdom II 题目连接: http://www.codeforces.com/contest/687/problem/D Description Long time a ...
- Codeforces Round #376 (Div. 2) A B C 水 模拟 并查集
A. Night at the Museum time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Codeforces Round #254 (Div. 2) B. DZY Loves Chemistry (并查集)
题目链接 昨天晚上没有做出来,刚看题目的时候还把题意理解错了,当时想着以什么样的顺序倒,想着就饶进去了, 也被题目下面的示例分析给误导了. 题意: 有1-n种化学药剂 总共有m对试剂能反应,按不同的 ...
- Codeforces Round #260 (Div. 1) C. Civilization 树的中心+并查集
题目链接: 题目 C. Civilization time limit per test1 second memory limit per test256 megabytes inputstandar ...
- Codeforces Round #385 (Div. 2)A B C 模拟 水 并查集
A. Hongcow Learns the Cyclic Shift time limit per test 2 seconds memory limit per test 256 megabytes ...
- Codeforces Round #250 (Div. 2) D. The Child and Zoo 并查集
D. The Child and Zoo time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- Codeforces Round #329 (Div. 2) D. Happy Tree Party(LCA+并查集)
题目链接 题意:就是给你一颗这样的树,用一个$y$来除以两点之间每条边的权值,比如$3->7$,问最后的y的是多少,修改操作是把权值变成更小的. 这个$(y<=10^{18})$除的权值如 ...
随机推荐
- ios中的RunLoop 和 android 中的Looper
今天写android程序,用到了Handler,晚上回来查阅资料,发现了Looper这个概念. 看了一下网上关于Looper的资料,发现这个Looper跟ios中的Runloop基本的理念完全一致! ...
- codeforces 490B.Queue 解题报告
题目链接:http://codeforces.com/problemset/problem/490/B 题目意思:给出每个人 i 站在他前面的人的编号 ai 和后面的人的编号 bi.注意,排在第一个位 ...
- 【leetcode】Populating Next Right Pointers in Each Node I & II(middle)
Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...
- ocx文件转换成C#程序引用的DLL
将ocx文件转换成C#程序引用的DLL文件的办法 将ocx文件转换成C#程序引用的DLL文件的办法,需要的朋友可以参考一下 1.打开VS2008或VS2010命令提示符(此例用VS2008) 将o ...
- Java Socket编程题库
一. 填空题 ___ IP地址____用来标志网络中的一个通信实体的地址.通信实体可以是计算机,路由器等. 统一资源定位符URL是指向互联网"资源"的指针,由4部分组成:协议 ...
- iOS 动态计算文本内容的高度
关于ios 下动态计算文本内容的高度,经过查阅和网上搜素,现在看到的有以下几种方法: 1. // 获取字符串的大小 ios6 - (CGSize)getStringRect_:(NSString* ...
- 实现Asp.Net Mvc4多级Views目录
建立自己MyViewEngine类让他继承RazorViewEngine,之后在构造函数里面写入设置视图位置格式代码如下: public class MyViewEngine : RazorViewE ...
- SQLServer视图
视图简介:通过定义 SELECT 语句以检索将在视图中显示的数据来创建视图.SELECT 语句引用的数据表称为视图的基表.在SQL Server 2005系统中,可以把视图分为3种类型,即标准视图,索 ...
- ios 多线程小结----- GCD篇
//3 GCD(充分利用设备的多盒)-------------屏蔽了线程,只能看见任务 队列步骤两步,定制任务,将任务添加到队列.GCD将添加的任务,放到线程中去执行,自动执行,自动释放原则:先进先出 ...
- lnmp初步学习知识整理
Linux常用30个命令 1.帮助命令 1) man 就是manual的缩写,用来查看系统中自带的各种参考手册(一般linux系统中自带英文手册)! man 命令名 //查看该命令的介绍 2) 命令名 ...