codeforces 1245D(最小生成树)
题面链接:https://codeforces.com/problemset/problem/1245/D
题意大概是给你一些城市的坐标,可以在城市中建立发电站,也可以让某个城市和已经建好发电站的城市连接,保证在这两种操作下使得所有的城市供电,在城市建发电站需要花费Ci,城市a和城市b连接需要花费(|Xa-Xb| + |Ya-Yb| )*(Ka+Kb),求最小的花费让所有城市通电。
思路:首先建立一个源点,连接各个城市,边权就是建发电站费用Ci,若选择此边则表示是在该城市建了发电站。
剩下的城市互相按照题意要求建边,建完全图。
最终模型就抽象成求最小生成树,用克鲁斯卡尔算法跑一下即可
AC代码:
#include<iostream>
#include<vector>
#include<set>
#include<cstdio>
#include<algorithm>
#define maxn 2005
using namespace std;
typedef long long ll;
struct node{
int from,to;
ll cost;
}e[maxn*maxn];//存储边的信息
int father[maxn];
int cnt,N,city;
vector<int> sta;//存建发电站的城市
vector<int> citya,cityb;//存储a b城市表示ab之间有电线
bool cmp(node a,node b){//比较函数
return a.cost < b.cost ;
}
void init(){//初始化
cnt = 0;
for(int i = 0;i<=N;i++){
father[i] = i;
}
}
int find(int x){//寻找根
if(x == father[x]) return x;
return father[x] = find(father[x]);
}
bool same(int x,int y){//判断是否在一个集合
return find(x)==find(y);
}
void unionSet(int x,int y){ //并查集合并
int u = find(x),v = find(y);
if(u==v) return ;
father[u] = v;
}
long long kruskal(){ //求最小生成树
ll res = 0;
std::sort(e,e+cnt,cmp);
for(int i = 0;i<cnt;i++){
if(same(e[i].from,e[i].to )) continue;
unionSet(e[i].from ,e[i].to );
if(e[i].from == 0 || e[i].to == 0){//判一下是否在城市建了发电站(利用源点判断)
if(e[i].from == 0) sta.push_back(e[i].to );
else sta.push_back(e[i].from);
}
else{//如果不是,存一些a,b两座连接的城市
citya.push_back(e[i].from ),cityb.push_back(e[i].to);
}
res+=e[i].cost ;
}
return res;
}
void addedge(int u,int v,ll C){ //建边操作
e[cnt].from = u,e[cnt].to = v,e[cnt].cost = C;
cnt++;
}
int main(){
cin>>N;
init();
vector<long long> vx,vy;
vector<long long> c,k;
for(int i = 0;i<N;i++){
int x,y;cin>>x>>y;
vx.push_back(x),vy.push_back(y);
}
for(int i = 0;i<N;i++){
ll tc;cin>>tc;
c.push_back(tc);
}
for(int i = 0;i<N;i++){
ll tk;cin>>tk;
k.push_back(tk);
}
for(int i = 0;i<N;i++){//建立源点,和各个城市连接
addedge(0,i+1,c[i]);
}
for(int i = 0;i<N;i++){//城市和城市之间建完全图
for(int j = i+1;j<N;j++){
ll c = (abs(vx[i]-vx[j])+abs(vy[i]-vy[j]))*(k[i]+k[j]);
addedge(i+1,j+1,c);
}
}
ll ans = kruskal();
cout<<ans<<endl;
cout<<sta.size()<<endl;
for(int i = 0;i<sta.size();i++){
if(i==0) cout<<sta[i];
else cout<<" "<<sta[i];
}
cout<<endl;
cout<<citya.size()<<endl;
for(int i = 0;i<citya.size() ;i++){
cout<<citya[i]<<" "<<cityb[i]<<endl;
}
return 0;
}
codeforces 1245D(最小生成树)的更多相关文章
- [Codeforces 1245D] Shichikuji and Power Grid (最小生成树)
[Codeforces 1245D] Shichikuji and Power Grid (最小生成树) 题面 有n个城市,坐标为\((x_i,y_i)\),还有两个系数\(c_i,k_i\).在每个 ...
- CodeForces - 1245D(思维+最小生成树)
题意 https://vjudge.net/problem/CodeForces-1245D 已知一个平面上有 n 个城市,需要个 n 个城市均通上电 一个城市有电,必须在这个城市有发电站或者和一个有 ...
- codeForces 472D 最小生成树
题目大意:给出一个图中点的两两距离,问是否是一棵树,若是,求出平均边权最大的点 prim最小生成树,若原图是树,则最小生成树的距离就是原距离.否则不是. 搞出来树了,第二问随便dfs就好了. #inc ...
- Xor-MST CodeForces - 888G (最小生成树,分治)
大意: n结点无向完全图, 给定每个点的点权, 边权为两端点异或值, 求最小生成树
- Mobile Phone Network CodeForces - 1023F (最小生成树)
大意: 无向图, 其中k条边是你的, 边权待定, m条边是你对手的, 边权已知. 求如何设置边权能使最小生成树中, 你的边全被选到, 且你的边的边权和最大. 若有多棵最小生成树优先取你的边. 先将$k ...
- CodeForces 1245D Shichikuji and Power Grid
cf题面 解题思路 比赛过程中想了一个贪心--把所有城市按照自建代价排序,排在第一的城市肯定自建,之后依次判断排在后面的城市要自建还是要连接前面的.这么做WA13了(第一次忘开long longWA4 ...
- The Shortest Statement CodeForces - 1051F 最小生成树+并查集+LCA
题目描述 You are given a weighed undirected connected graph, consisting of n vertices and mm edges. You ...
- Abandoning Roads CodeForces - 1149D (最小生成树)
大意: 给定无向图, 边权只有两种, 对于每个点$x$, 输出所有最小生成树中, 点$1$到$x$的最短距离. 先将边权为$a$的边合并, 考虑添加边权为$b$的边. 每条路径只能经过每个连通块一次, ...
- 正睿OI国庆DAY2:图论专题
正睿OI国庆DAY2:图论专题 dfs/例题 判断无向图之间是否存在至少三条点不相交的简单路径 一个想法是最大流(后来说可以做,但是是多项式时间做法 旁边GavinZheng神仙在谈最小生成树 陈主力 ...
随机推荐
- centos7上python3.6.5的安装及卸载
前言 最近开始安装配置公司给我的台式机,加上刚刚购买的ECS,处女座的我,环境前前后后大概装了有十来次吧,之前装总是临时网上找教程,但是装下来总是感觉有点别扭,当时服务器装的是3.6.5,虚拟机装的是 ...
- mysql 时间,时间戳,字符串之间相互转换
时间转字符串 date_format(now(),'%Y-%m-%d') 时间转时间戳 unix_timestamp(now()) 字符串转时间 str_to_date('2020-01-19','% ...
- 获取redis cluster master对应的slot分布情况
需求:原生的redis-trib.rb功能是强大,但输出的内容过于繁杂,比如我需要关注哪些master对应哪些slots,不是很直观,如果集群的规模更大的话,那么输出的结果获取信息更加困难. 说明:这 ...
- canvas转盘转动?
怎么实现类似转盘转动的效果? 现在这种实现思路是,canvas每次draw()并不是让图形在旋转,而是让每一份的颜色改变到达好像是转动的效果, 但是现在有一个问题,一开始渲染的颜色数量于份数是相同的, ...
- 【巨杉数据库SequoiaDB】企业级和开源领域“两开花”,巨杉引领国产数据库创新
2019年12月15日,OSC 源创会·年终盛典在深圳圆满举行.巨杉数据库作为业界领先的金融级分布式数据库厂商, 获得 “2019年开源数据库先锋企业” 及 “2019 GVP-Gitee最有价值开源 ...
- Web基础-Uri跟Url的区别
关于URL和URI的区别,个人见解. 初学java,最近被一个概念搞得头晕脑胀,就是url和uri的概念和区别,网上查了一大通,发现各种回答眼花缭乱,有百科直接粘贴的,有胡说八道的,有故意绕来绕 ...
- yii2表单提交CSRF验证
Yii2表单提交默认需要验证CSRF,如果CSRF验证不通过,则表单提交失败,解决方法如下: 第一种解决办法是关闭Csrf public $enableCsrfValidation = false; ...
- vmware运行ubuntu虚拟机出现诡异的鼠标闪烁
正在开心的写着AC自动机,突然发现鼠标消失了. 习惯性地动动鼠标,却还是没有反应,停止移动鼠标后鼠标却显现了出来??(吃惊.gif 在加载软件的时候,就算鼠标停止也会闪烁(其实这个虚拟机以前加载也会闪 ...
- 162.扩展User模型-使用Proxy模型
扩展用户模型: Django内置的User模型虽然已经足够强大了,但是有时候还是不能满足我们的需求,比如在验证用户登录的时候,它用的是用户名作为验证,而我们有时候需要通过手机号码或者是邮箱进行验证,还 ...
- 微服务读取不到config配置中心配置信息,Spring Boot无法找到PropertySource:找不到标签Could not locate PropertySource: label not found
服务出现报这个错, o.s.c.c.c.ConfigServicePropertySourceLocator - Could not locate PropertySource: label not ...