2017年9月16日提高组T2 A
Description
为了加快社会主义现代化,建设学校,小明决定给学校里每台电脑都连上互联网,方便未来随时随地玩耍。
他的电脑室很大,有N 台电脑,但地理位置偏僻,网络信号很差。
一台电脑有网,当且仅当满足以下至少一个条件:
1、给中国移动交宽带费,直接连网,花费为A。
2、向另外一台有网的电脑,安装共享网线,花费为B×两者曼哈顿距离。
现在,小明已经统计出了所有电脑的坐标。他想知道最少要多少费用才能达到目的。
Input
第一行:三个正整数,代表N、A、B。
接下来N 行:每行两个整数Xi、Yi,第i 行代表第i 台电脑的坐标。
Output
第一行:一个整数,代表答案
分析:把所有边连起来做最小生成树,如果当前边权大于A就去掉这条边。
代码
#include <cstdio>
#include <algorithm>
#include <cmath>
#define maxn 2000000
using namespace std;
struct arr
{
int p,q,w;
}a[maxn];
int x[maxn],y[maxn],f[maxn],n,A,B,dis;
bool v[maxn];
int mhd(int i,int j)
{
return (abs(x[i]-x[j])+abs(y[i]-y[j]))*B;
}
int so(arr x1,arr x2)
{
return x1.w<x2.w;
}
int find(int x)
{
if (f[x]==x) return x;
f[x]=find(f[x]);
return f[x];
}
int main()
{
scanf("%d%d%d",&n,&A,&B);
for (int i=1;i<=n;i++)
scanf("%d%d",&x[i],&y[i]);
int l=0;
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
{
a[++l].p=i;
a[l].q=j;
a[l].w=mhd(i,j);
}
sort(a+1,a+l+1,so);
for (int i=1;i<=l;i++)
f[i]=i;
for (int i=1;i<=l;i++)
{
int u=find(a[i].p);
int t=find(a[i].q);
if (u!=t)
{
f[u]=t;
dis+=min(a[i].w,A);
}
}
printf("%d",dis+A);
fclose(stdin);
fclose(stdout);
}