题意

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(思维+最小生成树)的更多相关文章

  1. codeforces 1245D(最小生成树)

    题面链接:https://codeforces.com/problemset/problem/1245/D 题意大概是给你一些城市的坐标,可以在城市中建立发电站,也可以让某个城市和已经建好发电站的城市 ...

  2. [Codeforces 1245D] Shichikuji and Power Grid (最小生成树)

    [Codeforces 1245D] Shichikuji and Power Grid (最小生成树) 题面 有n个城市,坐标为\((x_i,y_i)\),还有两个系数\(c_i,k_i\).在每个 ...

  3. CodeForces 76A Gift - 最小生成树

    The kingdom of Olympia consists of N cities and M bidirectional roads. Each road connects exactly tw ...

  4. Codeforces 424A (思维题)

    Squats Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Statu ...

  5. Codeforces 1060E(思维+贡献法)

    https://codeforces.com/contest/1060/problem/E 题意 给一颗树,在原始的图中假如两个点连向同一个点,这两个点之间就可以连一条边,定义两点之间的长度为两点之间 ...

  6. Queue CodeForces - 353D (思维dp)

    https://codeforces.com/problemset/problem/353/D 大意:给定字符串, 每一秒, 若F在M的右侧, 则交换M与F, 求多少秒后F全在M左侧 $dp[i]$为 ...

  7. CodeForces 141E: ...(最小生成树)

    [条件转换] 两两之间有且只有一条简单路径<==>树 题意:一个图中有两种边,求一棵生成树,使得这棵树中的两种边数量相等. 思路: 可以证明,当边的权是0或1时,可以生成最小生成树到最大生 ...

  8. UVA1537 Picnic Planning(思维+最小生成树)

    将1号点从图中去掉过后,图会形成几个连通块,那么我们首先可以在这些连通块内部求最小生成树. 假设有\(tot\)个连通块,那么我们会从1号点至少选\(tot\)个出边,使得图连通.这时我们贪心地选择最 ...

  9. codeforces 1244C (思维 or 扩展欧几里得)

    (点击此处查看原题) 题意分析 已知 n , p , w, d ,求x , y, z的值 ,他们的关系为: x + y + z = n x * w + y * d = p 思维法 当 y < w ...

随机推荐

  1. Flutter 基础控件

    内容: Button Image.Icon Switch.Checkbox TextField Form 1.Button RaisedButton 漂浮按钮 FlatButton 扁平按钮 Outl ...

  2. 激活windows操作系统的命令行指令

    1.开始菜单中搜索命令提示符,右键管理员运行 2.为了避免激活的失败,首先卸载已经过期的密钥 输入以下命令:slmgr.vbs /upk 回车确认之后会弹出提示“已成功卸载了产品密钥” 3.下一步是将 ...

  3. linux内核的冷热页分配器

    先说说cpu的cache,和cpu的cache比起来访问主内存是非常慢的,为了加快速度根据本地性原则,cpu在访问主内存的时候会把附近的一块数据都加载到cpu的cache里,之后读写这块数据都是在ca ...

  4. Scrapy的下载中间件

    下载中间件 简介 下载器,无法执行js代码,本身不支持代理 下载中间件用来hooks进Scrapy的request/response处理过程的框架,一个轻量级的底层系统,用来全局修改scrapy的re ...

  5. Java使用JDBC连接SQL Server数据库

    Java使用JDBC连接SQL Server数据库 1.下载驱动 1.下载Microsoft SQL Server JDBC 驱动程序 https://docs.microsoft.com/zh-cn ...

  6. 设计模式-Proxy(结构型模式)

    以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Proxy.h #pragma once class Subject { public: virtual ~Subject ...

  7. 【HDU4947】GCD Array(莫比乌斯反演+树状数组)

    点此看题面 大致题意: 一个长度为\(n\)的数组,实现两种操作:将满足\(gcd(i,k)=d\)的\(a_i\)加上\(v\),询问\(\sum_{i=1}^xa_i\). 对于修改操作的推式子 ...

  8. MySQL下载和安装教程

    1.下载MySQL数据库可以访问官方网站:https://www.mysql.com/ 2.点击DOWNLOADS模块下的Community模块下的MySQL Community Server进行下载 ...

  9. dotnetcore实现Aop

    dotnetcore实现Aop Aop大家都不陌生,然而今天给大家不将讲官方的filter,今天给大家分享一个轻量级的Aop解决方案(AspectCore) 什么是AspectCore AspectC ...

  10. 2019 年 GitHub 上最热门的 Java 开源项目

    1.JavaGuide https://github.com/Snailclimb/JavaGuide Star 22668 [Java 学习 + 面试指南] 一份涵盖大部分 Java 程序员所需要掌 ...