题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1601

题意:

  Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记。

  把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库。

  建造一个水库需要花费wi(1<=wi<=100000),连接两块土地需要花费P[i][j](1 <= p[i][j] <= 100000, p[i][j]=p[j][i], p[i][i]=0)。

  计算Farmer John所需的最少代价。

题解:

  农田标号1到n,建立超级源点为0号点。

  从超级源点向每个农田连一条长度为w[i]的边。然后n个农田之间再互相连接,边长为p[i][j]。

  然后求最小生成树就好。

AC Code:

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <algorithm>
  5. #include <vector>
  6. #define MAX_N 305
  7.  
  8. using namespace std;
  9.  
  10. struct Edge
  11. {
  12. int sour;
  13. int dest;
  14. int len;
  15. Edge(int _sour,int _dest,int _len)
  16. {
  17. sour=_sour;
  18. dest=_dest;
  19. len=_len;
  20. }
  21. Edge(){}
  22. friend bool operator < (const Edge &a,const Edge &b)
  23. {
  24. return a.len<b.len;
  25. }
  26. };
  27.  
  28. int n;
  29. int ans;
  30. int par[MAX_N];
  31. vector<Edge> edge;
  32.  
  33. void init_union_find()
  34. {
  35. for(int i=;i<=n;i++)
  36. {
  37. par[i]=i;
  38. }
  39. }
  40.  
  41. int find(int x)
  42. {
  43. return par[x]==x?x:par[x]=find(par[x]);
  44. }
  45.  
  46. void unite(int x,int y)
  47. {
  48. int px=find(x);
  49. int py=find(y);
  50. if(px==py) return;
  51. par[px]=py;
  52. }
  53.  
  54. bool same(int x,int y)
  55. {
  56. return find(x)==find(y);
  57. }
  58.  
  59. int kruskal()
  60. {
  61. init_union_find();
  62. sort(edge.begin(),edge.end());
  63. int cnt=;
  64. int res=;
  65. for(int i=;i<edge.size();i++)
  66. {
  67. Edge temp=edge[i];
  68. if(!same(temp.sour,temp.dest))
  69. {
  70. cnt++;
  71. res+=temp.len;
  72. unite(temp.sour,temp.dest);
  73. }
  74. }
  75. return cnt==n?res:-;
  76. }
  77.  
  78. void read()
  79. {
  80. cin>>n;
  81. int a;
  82. for(int i=;i<=n;i++)
  83. {
  84. cin>>a;
  85. edge.push_back(Edge(,i,a));
  86. }
  87. for(int i=;i<=n;i++)
  88. {
  89. for(int j=;j<=n;j++)
  90. {
  91. cin>>a;
  92. if(i<j) edge.push_back(Edge(i,j,a));
  93. }
  94. }
  95. }
  96.  
  97. void solve()
  98. {
  99. ans=kruskal();
  100. }
  101.  
  102. void print()
  103. {
  104. cout<<ans<<endl;
  105. }
  106.  
  107. int main()
  108. {
  109. read();
  110. solve();
  111. print();
  112. }

BZOJ 1601 [Usaco2008 Oct]灌水:最小生成树的更多相关文章

  1. BZOJ 1601 [Usaco2008 Oct]灌水 (最小生成树)

    题意 Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记.把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库. 建造一个水库需要 ...

  2. BZOJ 1601: [Usaco2008 Oct]灌水 最小生成树_超级源点

    Description Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记.把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库. ...

  3. BZOJ 1601 [Usaco2008 Oct]灌水

    1601: [Usaco2008 Oct]灌水 Time Limit: 5 Sec  Memory Limit: 162 MB Description Farmer John已经决定把水灌到他的n(1 ...

  4. BZOJ——1601: [Usaco2008 Oct]灌水

    http://www.lydsy.com/JudgeOnline/problem.php?id=1601 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit:  ...

  5. bzoj 1601: [Usaco2008 Oct]灌水【最小生成树】

    挺有意思的思路 如果不能自己打井,那么就是MST裸题了,考虑转换一下,自己打井就相当于连接一口虚拟的井(地下水?),所有井i到这口井的距离是w[i],这样把所有边排个序跑MST即可 #include& ...

  6. BZOJ 1601 [Usaco2008 Oct]灌水 (建图+mst)

    题意: 300个坑,每个坑能从别的坑引水,或者自己出水,i从j饮水有个代价,每个坑自己饮水也有代价,问让所有坑都有谁的最少代价 思路: 先建一个n的完全图,然后建一个超级汇点,对每个点连w[i],跑m ...

  7. BZOJ 1601: [Usaco2008 Oct]灌水( MST )

    MST , kruskal 直接跑 ---------------------------------------------------------------------- #include< ...

  8. Kruskal || BZOJ 1601: [Usaco2008 Oct]灌水 || Luogu P1550 [USACO08OCT]打井Watering Hole

    题面:P1550 [USACO08OCT]打井Watering Hole 题解:无 代码: #include<cstdio> #include<cstring> #includ ...

  9. 1601: [Usaco2008 Oct]灌水

    1601: [Usaco2008 Oct]灌水 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 1342  Solved: 881 [Submit][S ...

随机推荐

  1. Problem F

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) ...

  2. java 逻辑运算符 短路(条件操作)

    两个数字计算时都会先把数字转换成二进制后再进行换算,二进制就是由0和1组成的数字  http://yxwang0615.iteye.com/blog/1084288    

  3. TimeSpan时间间隔

    一个TimeSpan对象都表示一个时间间隔 (持续时间的时间或时间),单位为正数或负数的天数. 小时. 分钟. 秒和小数部分的第二个数字.TimeSpan结构还可以用于表示一天时间,但仅,如果与某一特 ...

  4. css hover对其包括的元素进行样式设置

    <ul class="icon-down-single-arr-li"> <li> <a href="javascript:void(0)& ...

  5. Spring学习八----------Bean的配置之Resources

    © 版权声明:本文为博主原创文章,转载请注明出处 Resources 针对于资源文件的统一接口 -UrlResource:URL对应的资源,根据一个URL地址即可创建 -ClassPathResour ...

  6. Mac中遇到的Eclipse连接不上mySql的问题

    1.首先我们在eclipse中连接数据库的过程中,遇到的问题就是如上图.开始百度Communications link failure 这几个关键字.得到的结果基本上就是基本配置参数wait_time ...

  7. Proving Equivalences (hdu 2767 强联通缩点)

    Proving Equivalences Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  8. 数据库ACID操作---事务四原则

    事务操作四原则: 1>原子性:简单来说——整个事务操作如同原子已经是物理上最小的单位,不可分离事务操作要么一起成功,要么一起失败. 2>一致性:倘若事务操作失败,则回滚事务时,与原始状态一 ...

  9. asp.net 后台多线程异步处理时的 进度条实现一(Ajax+Ashx实现以及封装成控件的实现)

    (更新:有的同学说源代码不想看,说明也不想看,只想要一个demo,这边提供一下:http://url.cn/LPT50k (密码:TPHU)) 工作好长时间了,这期间许多功能也写成了不少的控件来使用, ...

  10. C#使用for循环移除HTML标记

    public static string StripTagsCharArray(string source) { char[] array = new char[source.Length]; int ...