UESTC_秋实大哥与连锁快餐店 2015 UESTC Training for Graph Theory<Problem A>

A - 秋实大哥与连锁快餐店

Time Limit: 9000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

Submit Status

成大事者,不惟有超世之才,亦有坚忍不拔之志。

秋实大哥开了一家快餐店之后,由于人赢光环的影响,很快就赚得了大量的资金。为了继续实现心中的远大的理想,他打算在全国各地开设分店赚大钱。假设现在有n家快餐店(其中有至少有一家是旗舰店)分布在二维平面上,第i家快餐店的坐标为(xi, yi)。为了方便交通,他打算在一些快餐店之间修建道路使得任意一家快餐店都能够通过道路到达某一家旗舰店。

但是秋实大哥忙于赚钱和过节,没有时间来设计道路,你能帮助秋实大哥算出最少一共需要修建多长的道路吗?

Input

第一行一个整数n,表示快餐店的个数。(n≤6666) 接下来n行,每行两个整数xi,yi,zi(−1000000≤xi,yi≤1000000)。表示第i家快餐店的位置(xi,yi),如果zi=0表示该店是普通的分店,如果 zi=1表示该店是旗舰店。

保证至少有一家旗舰店

Output

输出最少一共需要修建的道路长度,保留小数点后两位。

Sample input and output

Sample Input Sample Output
3
1 -1 0
1 1 0
0 0 1
2.83

解题思路:

我们注意到每个普通店都需要连接至少一个旗舰店,但是旗舰店之间并没有要求,那么我们可以认为所有旗舰店都已被连接,不过它们连接的代价是 0 罢了,这样,我们就成功的把这道题转换成了一道最小生成树题目.

最小生成树拥有Prim 和 Krusal 算法,但是本题显然是稠密图,因此我们采用Prim算法跑一遍即可.

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 6666 + 50;
/*
 Prim Algorithm
 0 -> 普通店
 1 -> 旗舰店
*/

typedef struct Point
{
  double x,y;
  char type;
};

Point p[maxn];
double lowcost[maxn];
int n;
double ans = 0.;

inline double distant(int u,int v)
{
   return sqrt( (p[u].x - p[v].x)*(p[u].x - p[v].x) + (p[u].y - p[v].y)*(p[u].y - p[v].y) );
}

void prim()
{
   for(int i = 0 ; i < n ; ++ i)
    if (p[i].type) //旗舰店
     {
         lowcost[i] = -1.;
         for(int j = 0 ; j < n ; ++ j)
          {
             double dis = distant(i,j);
             lowcost[j] = min(lowcost[j] , dis);
         }
     }
   for(int i = 0 ; i < n ; ++ i)
    {
        double minval = 1e233;
        int choosepoint = -1;
        for(int j = 0 ; j < n ; ++ j)
         {
             if (lowcost[j] != -1 && lowcost[j] < minval)
              {
                 minval = lowcost[j];
                choosepoint = j;
             }
         }
        if (choosepoint == -1)
         return;
        ans += lowcost[choosepoint];
        lowcost[choosepoint] = -1;
        for(int j = 0 ; j < n ; ++ j)
         {
             double dis = distant(choosepoint,j);
             lowcost[j] = min(lowcost[j],dis);
         }
    }
}

int main(int argc,char *argv[])
{
  scanf("%d",&n);
  for(int i = 0 ; i < n ; ++ i) lowcost[i] = 1e233;
  for(int i = 0 ; i < n ; ++ i)
   scanf("%lf%lf%d",&p[i].x,&p[i].y,&p[i].type);
  prim();
  printf("%.2lf\n",ans);
  return 0;
}
时间: 2024-07-30 10:17:03

UESTC_秋实大哥与连锁快餐店 2015 UESTC Training for Graph Theory<Problem A>的相关文章

UESTC_秋实大哥与时空漫游 2015 UESTC Training for Graph Theory&lt;Problem C&gt;

C - 秋实大哥与时空漫游 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 秋实大哥通过全国的连锁快餐店发家致富,赚了大钱,接下来他打算通过这些钱实现他的另一个梦想————遨游太空,漫游星际. 秋实大哥满怀期待的出发了. .......啦啦啦啦啦啦啦啦啦...... 最后,秋实大哥花完了钱,觉得是时候回地球继续赚钱和过节了. 但是却被告知回地球的专机

UESTC_秋实大哥与妹纸 2015 UESTC Training for Data Structures&lt;Problem F&gt;

F - 秋实大哥与妹纸 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 1500/1500KB (Java/Others) Submit Status 致中和,天地位焉,万物育焉.秋实大哥是一个追求中庸的人. 虽然秋实大哥的仰慕者众多,但秋实大哥不喜欢极端的妹纸.所以他想从所有仰慕自己的妹纸中挑选出一个符合中庸之道的. 每一个妹纸对秋实大哥的仰慕程度可以用一个整数ai来表示,秋实大哥想要找出这些数的中位数. 计算有限个数的数据的中位

UESTC_秋实大哥与线段树 2015 UESTC Training for Data Structures&lt;Problem M&gt;

M - 秋实大哥与线段树 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status “学习本无底,前进莫徬徨.” 秋实大哥对一旁玩手机的学弟说道. 秋实大哥是一个爱学习的人,今天他刚刚学习了线段树这个数据结构. 为了检验自己的掌握程度,秋实大哥给自己出了一个题,同时邀请大家一起来作. 秋实大哥的题目要求你维护一个序列,支持两种操作:一种是修改某一个元素的值:一

UESTC_秋实大哥の恋爱物语 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem K&gt;

K - 秋实大哥の恋爱物语 Time Limit: 5000/2000MS (Java/Others)     Memory Limit: 32000/32000KB (Java/Others) Submit Status 传说有这么一个故事! 在一个月白风清的晚上,秋实大哥约一位他心仪的妹子一起逛校园,浪漫的秋实大哥决定在当晚对妹子表白.“XXXXX...”,秋实大哥温情地说完了准备已久的话.而妹子决定用一种浪漫的方式接受秋实大哥(其实妹子早已对秋实大哥动心,这一刻她早已迫不及待了,但还是决定

UESTC_秋实大哥带我飞 2015 UESTC Training for Graph Theory&lt;Problem B&gt;

B - 秋实大哥带我飞 Time Limit: 300/100MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 然而题目和题面并没有什么关系. 给出n个点,m条带权无向边,问你从1号点到n号点的最短路中有多少种走法? Input 第一行两个数n,m分别表示点的个数和边的个数. (2≤n≤2000,1≤m≤2000) 接下来m行,每行3个数u,v,w表示u号点到v号点有一条距离为w的边.(1≤u

UESTC_排名表 2015 UESTC Training for Graph Theory&lt;Problem I&gt;

I - 排名表 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 暑假前集训已经过了一半了,我们将会把当前排名公布出来.但是此刻秋实大哥却心急火燎,因为他不慎把排名删除了. 一共有n个人参加排名,每个人都有一个名次,没有哪两个人的名次是相同的.现在秋实大哥掌握的一些情报,比如Ai的名次要先于Bi.(编号从1开始) 你能帮秋实大哥恢复出排名表吗? Inp

UESTC_方老师和农场 2015 UESTC Training for Graph Theory&lt;Problem L&gt;

L - 方老师和农场 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 方老师重新开了一家农场,农场一共有N个节点和M条双向边,但是有一个很大的问题就是有比如一个农场A到达农场B只有一条路径,问至少添加多少条边使得任意两个农场之间的路径多于一条. Input 多组数据,EOF结束. 第1行:N和M. 第2到第M+1行:每一行2个数Ui和Vi,表示Ui到

UESTC_传输数据 2015 UESTC Training for Graph Theory&lt;Problem F&gt;

F - 传输数据 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 机房里面有m台电脑,n台网线,每条网线都每秒中最多传送的数据量,现在需要你计算从标号为1的电脑传送数据到编号为m的电脑,问一秒内最多传送多少数据? Input 第1行: 两个用空格分开的整数N(0≤N≤200)和 M(2≤M≤200).N网线的数量,M是电脑的数量. 第二行到第N+1行

UESTC_树上的距离 2015 UESTC Training for Graph Theory&lt;Problem E&gt;

E - 树上的距离 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Submit Status 给你一棵带权树,边权表示两点间的距离.有如下两种操作: 询问两点间的最短距离. 修改一条边权值. 对每个操作1,回答两点间的距离. Input 第一行一个数n,表示点的个数.接下来n−1行,每行3个数u,v,w,表示u,v间有权为w的边.边按照输入顺序从1到n−1编号.输入保证为