[Awson原创]修水渠(canal)

Description

Awson是某国际学校信竞组的一只菜鸡。他们班主任F老师喜欢带他们去爬爬唷喽山。登顶后,Awson有了个奇怪的发现。

山腰上有N(1<=N<=100)个村庄,这些村庄可以用平面坐标(X,Y)刻画。假设要给这N个村庄供水。已知1号村庄内有一个处理水厂, 从此处可以输水给其他各个村庄。现在给出M(1<=M<=10000)种修水渠的方案,每种方案的水渠连接两个村庄U,V。由于地势等其他原 因,水的运输是单向的,即只能从U运输到V。水渠是笔直的,即水渠的长度就是U,V两村庄的欧式距离。因为Awson是一个善于发现问题、提出问题,但不 喜欢解决问题的人。所以他找到了你,烦请你设计出能够将水输送到所有村庄的方案,并且使水渠总长度最小。

Input

第1行:两个整数,N,M。

接下来N行,每行两个整数,第i行Xi,Yi,表示村庄的坐标。

再接下来M行,每行两个整数,第i行Ui,Vi,表示Ui,Vi两村庄间有一条从Ui到Vi的修水渠方案。

Output

共1行,1个整数,表示使所有机房连上网的费用最小值。

Sample Input1

4 60 64 60 07 201 21 32 33 43 13 2

Sample Output1

31.19

Sample Input2

4 3
0 0
1 0
0 1
1 2
1 3
4 1
2 3

Sample Output2

poor Awson

Hint

样例解释:

对于样例1:选择第1、2、4方案,长度最小,其为31.19;

对于样例2:没有方案使其连通。

数据规模:

40%的数据:1<=N<=50,1<=M<=2500;

100%的数据:1<=N<=100,1<=M<=10000,1<=X,Y<=10000,数据不保证无自环,不保证无重边、回边。

题解

朱刘算法裸题,当模板存着。

  1 #include<map>
  2 #include<queue>
  3 #include<stack>
  4 #include<vector>
  5 #include<ctime>
  6 #include<cmath>
  7 #include<cstdio>
  8 #include<string>
  9 #include<cstdlib>
 10 #include<cstring>
 11 #include<iostream>
 12 #include<algorithm>
 13  using namespace std;
 14 const int N=100;
 15
 16 struct node
 17 {
 18     int x,y;
 19 }pos[N+5];
 20 struct tt
 21 {
 22     int u,v;
 23     double c;
 24 }edge[N*N+5];
 25 int n,m,u,v;
 26 inline double Dist(int u,int v);
 27
 28 double in[N+5];
 29 int vis[N+5];
 30 int pre[N+5];
 31 int id[N+5],cnt;
 32 double ZLEdmons();
 33
 34 int main()
 35 {
 36     scanf("%d%d",&n,&m);
 37     for (int i=1;i<=n;i++) scanf("%d%d",&pos[i].x,&pos[i].y);
 38     bool in[N+5]={0};
 39     for (int i=1;i<=m;i++)
 40     {
 41         scanf("%d%d",&u,&v);
 42         edge[i].v=v;
 43         edge[i].u=u;
 44         edge[i].c=Dist(u,v);
 45         in[v]=1;
 46     }
 47     for (int i=1;i<=n;i++) if (!in[i])
 48     {
 49         printf("poor Awson\n");
 50         return 0;
 51     }
 52     printf("%.2lf\n",ZLEdmons());
 53     return 0;
 54 }
 55
 56 inline double Dist(int u,int v){return sqrt((pos[u].x-pos[v].x)*(pos[u].x-pos[v].x)+(pos[u].y-pos[v].y)*(pos[u].y-pos[v].y));}
 57 double ZLEdmons()
 58 {
 59     double ans=0;
 60     int root=1;
 61     while (true)
 62     {
 63         memset(in,127,sizeof(in));
 64         for (int i=1;i<=m;i++)
 65         {
 66             if (edge[i].c<in[edge[i].v]&&edge[i].u!=edge[i].v)
 67             {
 68                 in[edge[i].v]=edge[i].c;
 69                 pre[edge[i].v]=edge[i].u;
 70             }
 71         }
 72         in[root]=0;
 73         int cnt=0;
 74         memset(id,-1,sizeof(id));
 75         memset(vis,-1,sizeof(vis));
 76         for (int i=1;i<=n;i++)
 77         {
 78             ans+=in[i];
 79             v=i;
 80             while (vis[v]!=i&&v!=root&&id[v]==-1)
 81             {
 82                 vis[v]=i;
 83                 v=pre[v];
 84             }
 85             if (v!=root&&id[v]==-1)
 86             {
 87                 id[v]=++cnt;
 88                 for (int u=pre[v];u!=v;u=pre[u]) id[u]=cnt;
 89             }
 90         }
 91         if (cnt==0) break;
 92         for (int i=1;i<=n;i++) if (id[i]==-1) id[i]=++cnt;
 93         for (int i=1;i<=m;i++)
 94         {
 95             v=edge[i].v;
 96             edge[i].u=id[edge[i].u];
 97             edge[i].v=id[edge[i].v];
 98             if (edge[i].u!=edge[i].v) edge[i].c-=in[v];
 99         }
100         n=cnt;
101         root=id[root];
102     }
103     return ans;
104 }
时间: 2024-11-07 07:17:19

[Awson原创]修水渠(canal)的相关文章

树的问题小结(最小生成树、次小生成树、最小树形图、LCA、最小支配集、最小点覆盖、最大独立集)

树的定义:连通无回路的无向图是一棵树. 有关树的问题: 1.最小生成树. 2.次小生成树. 3.有向图的最小树形图. 4.LCA(树上两点的最近公共祖先). 5.树的最小支配集.最小点覆盖.最大独立集. 一.最小生成树 解决的问题是:求无向图中边权值之和最小的生成树. 算法有Kruskal和Prim. Kruskal使用前向星和并查集实现,可以存储重边(平行边),时间复杂度是O(m log m  +  m),m是边的数量. Prim使用邻接矩阵建图,不可以存储重边(平行边),如果出现重边,存储的

疫情当下,如何进行远程协作办公?

?新冠疫情,随着春节的脚步一下就席卷了大江南北.这个春节,相信每一家,每一人都过得很不平静.作为大众而言,生活在继续,工作在继续,我们给武汉加油,给政府打气.面对疫情,最好的方式就是不给国家和他人添乱,在家好好整顿,积蓄疫情之后的力量. 很快就到了春节后重新开工的时间,严峻的疫情形势会让很多公司开始考虑到平衡员工健康和业务进展,其中一个必然的选项是远程办公.这虽是无奈之选,但也可能给未来的企业组织形态开启一个新认知,那就是其实已经有越来越多的企业.团队和组织在实践远程工作了. 一开始的远程办公,

【杰克&#183;康菲尔德】《如何用禅修的智慧解决现实问题》

野兽按:杰克·康菲尔德首次访华,总共接受了三家媒体的采访,一个是<心理月刊>的王珲,一个是<心探索>的蔡娜,一个是<心灵自由>的陈寿文和偲程,目前大家看到的只有蔡娜的采访稿,我没写,王珲姐不知写了没?偲程写了,我得问他要稿子看看.三家媒体也有意思,都是带”心“的媒体,心理月刊是纸媒,心探索是网媒,心灵自由是自媒.我还让康老当了一把书模,主图中他手中拿的是<初学者的冥想书>和<智慧的心>. 采访\蔡娜 摄影.剪辑\盒子 很多现代人是很实际的,禅修不

【springmvc+mybatis项目实战】杰信商贸-30.出口报运增删查修mapper+Dao+Service+Controller

我们接下来做我们项目的下一个环节,就是出口报运的业务,首先我们来看看两个设计方式 a)大型项目设计方式 传统设计方式,基于对象关联,数据量小时,系统无碍:当数据随着系统的使用,线性增长,系统变的越来越慢,到达一定数据量时,性能急剧下降. b)新的设计方式:打断设计 在表中增加一个字段,这个字段用来存储关联表的主键集合:在报运业务中要查询合同下的货物信息.直接通过这个关联字段,利用in子查询直接去查询货物表,这样查询效率提高很多.而且数据量越大,查询效率越高.这种方式,业务关联层级越多,这种设计方

修炼一名程序员的职业水准(林庆忠__署名原创)

http://blog.csdn.net/baselive/article/details/306412 摘: 作者:林庆忠,1990年毕业于昆明工学院计算机软件专业,后又于1999年毕业在南京大学 完成软件工程专业硕士的学习,现供职于CNPC旗下的一个行业软件研发中心,因为在网上看了许多有经验的各路软件开发人员写的好帖,一时手痒兴起,也凑一篇壮壮声势. 假设你是一名软件专业毕业的本科学子,如何在工作中修炼成为一名有较高职业水准的程序员呢,本文试图总结作者从事15年软件开发工作的感想,希望对有志

从此刻禅修

近一年半,我陷入了一种痛苦的焦虑之中.我很清楚自己为什么陷入这种焦虑中,一切没有什么好抱怨的.遭遇各不相同,又如何陷入无谓的比较呢.... 我决心向Steve jobs 一样开始禅修. 我爱这个世界,爱我身边可爱的人们,我希望自己能够从容的表达自己的善意,我也依旧相信这个时间的美丽. 我相信我能够自信起来,开心起来.无论现实多么残酷,我希望自己活出自我,活出价值.我渴望有人给我帮助,但我有凭什么奢求呢?一切顺其自然罢!无愧于心便是好的. 我会更加提高自己,无论是技术,情商,自我管理.我坚信,男儿

大钟的ios开发之旅(2)————简单说说ios中ARC与非ARC模式下的property的变量修饰词

/******************************************************************************************** * author:[email protected]大钟 * E-mail:[email protected] *site:http://www.idealpwr.com/ *深圳市动力思维科技发展有限公司 * http://blog.csdn.net/conowen * 注:本文为原创,仅作为学习交流使用,转

原创分享单臂路由课堂笔记

原创分享北京北大青鸟单臂路由课堂笔记 1.单臂路由:不同vlan之间通讯 2.单臂路由概念: 子接口(把路由器的物理接口逻辑上划分成多个子接口) (子接口作为vlan的网关) 单臂路由链路类型:接入access链路(交换机和主机之间是接入链路);中继trunk链路(交换机和交换机之间.交换机和路由器之间配置成中继链路) 3.单臂路由工作过程:源客户端发送正常数据帧给交换机,交换机查看源vlan并进行源vlan封装,把数据传输给路由器,路由器查看目标IP地址,把源vlan标签封装为目标vlan标签

关于代码重构:是微修还是全部推倒重来

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 虽然不是很切题但还是放在Cocos2D的学习系列博文中吧,因为这是我写cocos2D代码中体会到的. RPG游戏码代码到现在已经写了不少行代码了. 最近在加入新功能的时候发现以前遗留的人物对话问题一直没有解决,游戏对话逻辑是RPG中重要的逻辑,而我的代码问题具体表现在: 对话代码逻辑及其复杂.因为以前从来没有写过类似的代码,要想支持游戏剧情的复杂性,必须将对话