Shichikuji and Power Grid
2024-10-06 18:57:40
思路:一个很裸的最小生成树。把建立基站看成是,城市与源点(虚构的)建边。由此建立最小生成树,即可得出答案。
代码:
// Created by CAD on 2019/11/2.
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;
const int maxn=2020*2000;
struct edge{
ll u,v;
ll w;
bool operator<(edge &e)
{
return w<e.w;
}
}e[maxn];
ll fa[2005],x[2005],y[2005],c[2005],k[2005];
int n;
vector<int> out1;
vector<pii> out2;
int find(int i)
{
return i==fa[i]?i:fa[i]=find(fa[i]);
}
int cnt=0;
int cnt1=0;
ll kruskal()
{
ll ans=0;
for(int i=0;i<=n;++i)
fa[i]=i;
for(int i=1;i<=cnt;++i)
{
int u=find(e[i].u),v=find(e[i].v);
if(u!=v)
{
ans+=e[i].w,fa[v]=u;
if(!e[i].u) out1.push_back(e[i].v);
else out2.push_back({e[i].u,e[i].v});
}
}
return ans;
}
int main()
{
// FOPEN;
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;++i)
cin>>x[i]>>y[i];
for(int i=1;i<=n;++i)
cin>>c[i];
for(int i=1;i<=n;++i)
cin>>k[i];
for(int i=1;i<=n;++i)
e[++cnt]=edge{0,i,c[i]};
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
e[++cnt]=edge{i,j,1ll*(abs(x[i]-x[j])+abs(y[i]-y[j]))*(k[i]+k[j])};
sort(e+1,e+cnt+1);
cout<<kruskal()<<endl;
cnt1=out1.size();
cout<<cnt1<<endl;
for(int i=0;i<cnt1-1;++i)
cout<<out1[i]<<" ";
if(cnt1)
cout<<out1[cnt1-1]<<endl;
cout<<out2.size()<<endl;
for(auto i:out2)
cout<<i.first<<" "<<i.second<<endl;
return 0;
}
最新文章
- 命令行提交本地项目到github上
- Linux下PHP的完全卸载
- Sphinx的配置和使用
- 为什么eclipse中启动tomcat后,浏览器中出现404?
- pt-find 使用实例
- iOS开发-Xcode升级后插件失效解决办法
- oracle 导入数据时提示只有 DBA 才能导入由其他 DBA 导出的文件
- [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
- tr删除替换详解
- JavaScript 高级程序设计(第3版)笔记——chapter4:变量、作用域和内存问题
- javamail发送邮件的简单实例(转)
- Iterator对对象遍历
- PHP读取数据库表显示到前台
- Java实现简易联网坦克对战小游戏
- LOJ#6285. 数列分块入门 9
- ImageMagick - 设置透明带 AlphaChannel 的 png 图片的透明度
- 进程池 和 multiprocessing.Pool模块
- 初识TypeScript
- hdfoo站点开发笔记-2
- 初识DOM