CodeForces - 1245D(思维+最小生成树)
题意
https://vjudge.net/problem/CodeForces-1245D
已知一个平面上有 n 个城市,需要个 n 个城市均通上电
一个城市有电,必须在这个城市有发电站或者和一个有电的城市用电缆相连
在一个城市建造发电站的代价是 c[i]
i和 j 两个城市相连的代价是 k[i]+k[j] 乘上两者的曼哈顿距离
求最小代价的方案
输入:
第一行为城市个数
下面是每个城市的坐标
下面是建造发电站的代价 c[i]
下面是每个城市连线的系数 k[i]
输出:
一个为最小代价
建造发电站的城市数,和每个城市
连线的条数,和每条连线
任意一种即可,输出顺序任意
思路
将所有点两两之间连边,权值为k[i]+k[j] 乘上两者的曼哈顿距离,新建一个点0,其他点和0如果连边说明这个点建发电站。
跑一遍最小生成树即可。
代码
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=2005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
bool vis[N];
int lowc[N],n,pre[N];
ll prim(ll cost[][N])
{
ll ans=0;
memset(vis,false,sizeof(vis));
vis[0]=true;
for(int i=1; i<=n; i++)
{
lowc[i]=cost[0][i];
}
for(int i=1; i<=n; i++)
{
ll minc=1e16;
int p=-1;
for(int j=0; j<=n; j++)
{
if(!vis[j]&&minc>lowc[j])
{
minc=lowc[j];
p=j;
}
}
if(minc==inf) return -1;
ans+=minc;
vis[p]=true;
for(int j=0; j<=n; j++)
{
if(!vis[j]&&lowc[j]>cost[p][j])
lowc[j]=cost[p][j],pre[j]=p;
}
}
return ans;
}
struct node
{
ll x,y,c,k;
} g[N];
ll G[N][N];
int main()
{
std::ios::sync_with_stdio(false);
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>g[i].x>>g[i].y;
}
for(int i=1; i<=n; i++)
cin>>g[i].c;
for(int i=1; i<=n; i++)
cin>>g[i].k;
for(int i=1; i<=n; i++)
{
for(int j=i+1; j<=n; j++)
{
G[i][j]=G[j][i]=(g[i].k+g[j].k)*(abs(g[i].x-g[j].x)+abs(g[i].y-g[j].y));
}
}
for(int i=1; i<=n; i++)
{
G[0][i]=G[i][0]=g[i].c;
}
cout<<prim(G)<<endl;
int cnt=0;
for(int i=1; i<=n; i++)
{
if(pre[i]==0)
cnt++;
}
cout<<cnt<<endl;
for(int i=1; i<=n; i++)
{
if(pre[i]==0)
{
cout<<i<<" ";
}
}
cout<<endl;
cnt=n+1-1-cnt;
cout<<cnt<<endl;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(pre[j]==i||pre[i]==j)
{
cout<<i<<" "<<j<<endl;
}
}
}
return 0;
}
CodeForces - 1245D(思维+最小生成树)的更多相关文章
- codeforces 1245D(最小生成树)
题面链接:https://codeforces.com/problemset/problem/1245/D 题意大概是给你一些城市的坐标,可以在城市中建立发电站,也可以让某个城市和已经建好发电站的城市 ...
- [Codeforces 1245D] Shichikuji and Power Grid (最小生成树)
[Codeforces 1245D] Shichikuji and Power Grid (最小生成树) 题面 有n个城市,坐标为\((x_i,y_i)\),还有两个系数\(c_i,k_i\).在每个 ...
- CodeForces 76A Gift - 最小生成树
The kingdom of Olympia consists of N cities and M bidirectional roads. Each road connects exactly tw ...
- Codeforces 424A (思维题)
Squats Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit Statu ...
- Codeforces 1060E(思维+贡献法)
https://codeforces.com/contest/1060/problem/E 题意 给一颗树,在原始的图中假如两个点连向同一个点,这两个点之间就可以连一条边,定义两点之间的长度为两点之间 ...
- Queue CodeForces - 353D (思维dp)
https://codeforces.com/problemset/problem/353/D 大意:给定字符串, 每一秒, 若F在M的右侧, 则交换M与F, 求多少秒后F全在M左侧 $dp[i]$为 ...
- CodeForces 141E: ...(最小生成树)
[条件转换] 两两之间有且只有一条简单路径<==>树 题意:一个图中有两种边,求一棵生成树,使得这棵树中的两种边数量相等. 思路: 可以证明,当边的权是0或1时,可以生成最小生成树到最大生 ...
- UVA1537 Picnic Planning(思维+最小生成树)
将1号点从图中去掉过后,图会形成几个连通块,那么我们首先可以在这些连通块内部求最小生成树. 假设有\(tot\)个连通块,那么我们会从1号点至少选\(tot\)个出边,使得图连通.这时我们贪心地选择最 ...
- codeforces 1244C (思维 or 扩展欧几里得)
(点击此处查看原题) 题意分析 已知 n , p , w, d ,求x , y, z的值 ,他们的关系为: x + y + z = n x * w + y * d = p 思维法 当 y < w ...
随机推荐
- Android开发与Sequoyah的安装问题
首次接触Android开发,在搭建开发环境时遇到困难,写出来和大家分享分享. 使用的ide为捆绑了adt插件和android sdk的eclipse adt bundle,无需安装android sd ...
- Jackson version is too old 2.xx
我使用的是IDEA,很简单. 切换到project,如果下面的module版本是2.65,上面的jackson.core.xx小于2.65就会报old,如果高于2.65就会报不兼容. 所以调整成相同的 ...
- Data Pump Export 数据泵导出因ORA-31693 ORA-02354 和 ORA-01555 错误且没有LOB损坏而失败 (Doc ID 1507116.1)
Data Pump Export Fails With ORA-31693 ORA-02354 and ORA-01555 Errors And No LOB Corruption (Doc ID 1 ...
- oracle数据库自动生成数据库表结构文档(亲测有效)
import java.awt.Color; import java.io.FileOutputStream; import java.sql.Connection; import java.sql. ...
- Linux Thermal Framework分析及实施
关键词:Zone.Cooling.Governor.Step Wise.Fair Share.trip等等. Linux Thermal的目的是控制系统运行过程中采样点温度,避免温度过高造成器件损坏, ...
- UML工具-1-StarUML下载及破解
UML工具-StarUML 下载地址 http://staruml.io/
- PHP的stdClass
概述 以下是百度百科对php中的 stdClass的描述: stdClass在PHP5才开始被流行.而stdClass也是zend的一个保留类.stdClass类是PHP的一个内部保留类,初始时没有成 ...
- 04_javaSE面试题:方法的参数传递机制
题目 import java.util.Arrays; /** * @author kevin * @date 2019/7/10 9:46 */ public class Exam4 { publi ...
- 不用输入ssh -i命令行即可携带pem文件快速登录的方法
如果要登录的服务器只允许pem认证 每次输入ssh -i xxxx.pem 用户@ip 地址 就很烦 这里有个一劳永逸的方法: 进入到自己的用户目录,例如/home/me 把pem文件放在当前目录 ...
- html的特殊符号对照表
HTML的特殊符号对照表. 特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 Α Α Α Β Β Β Γ Γ Γ Δ Δ Δ Ε Ε Ε Ζ Ζ Ζ Η ...