Day1 T1 通信

通信

一场天灾过后,B市的所有主干道路都被切断了。

灾后重建的一项重要任务是恢复通信。B市共有n个关键的据点,而我们现在有一条关键的消息,需要所有的据点都要收到。

消息的传递有两种方式:

空降:可以直接将消息传给某个据点,每次需要的代价为 v。
通信员:可以将消息从一个据点传到另一个据点,需要的代价为两个据点在地图上的欧氏距离的平方。
注意,通信员只能从已有消息的据点传递消息到另一个据点。所以,至少第一个收到消息的据点一定是通过空降的。

在保证所有的据点都收到消息的前提下,最小的总代价是多少?

输入格式

输入的第一行包含空格隔开的两个数n, v。

接下来n行,每行有两个空格隔开的数x, y,表示每个据点在地图上的坐标。

输出格式

输出一行,仅包含一个整数,表示最小的总代价。

数据范围

测试点中的n的大小分布为:

1,5,9,13,17,50,300,1000,3000,5000

对于所有数据,保证
\(0 \leq v \leq 1000000\)
\(0 \leq x, y \leq 300000\)

求最小总代价

最小生成树prim

prim优势:题目要求"吸"点,与prim类似

cin>>n>v;
for(int i=1;i<=n;i++)
    cin>>x[i]>>y[i];
for(int i=1;i<=n;i++)
    d[i]=v;
for(int k=1;k<=n;k++)
{
    int c=-1;
    for(int u=1;u<=n;u++)
        if(!chosen[u]&&c==-1||d[c]>d[u])
            c=u;
    chosen[c]=true;
    ans+=d[c];
    for(int v=1;v<=n;v++)
        if(d[v]>dis(c,v))
            d[v]=dis(c,v);
}
posted @ 2019-10-07 22:33  AhoCorasick  阅读(202)  评论(0)    收藏  举报