码迷,mamicode.com
首页 > 其他好文 > 详细

ZJNU 1213 - 取水——高级

时间:2020-01-25 23:27:31      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:高级   struct   find   连接   sum   没有   str   需要   style   

某个村庄i可以打一口井取水花费费用Wi,也可以与有水的村庄连接取水

又因为不可能没有一个村庄不打井(即至少有一个村庄打井,其余村庄连向它)

实际上就可以理解为,将水井看作第N+1个村庄,需要有村庄与这个N+1村庄相连,才能保证所有村庄有水

而村庄i连接到村庄N+1的费用,就可以直接理解为打井的费用Wi

其余部分使用Kruskal最小生成树即可

 1 /*
 2 Written By StelaYuri
 3 */
 4 #include<cstdio>
 5 #include<algorithm>
 6 using namespace std;
 7 struct tube{
 8     int from,to,cost;
 9     bool operator < (const tube &a) const{
10         return cost<a.cost;
11     }
12 }p[90001];
13 int gp[301];
14 int find(int a){
15     return a==gp[a]?a:(gp[a]=find(gp[a]));
16 }
17 int main(){
18     int i,j,N,d,cnt=0,k=0,sum;
19     scanf("%d",&N);
20     for(i=1;i<=N;i++){
21         scanf("%d",&d);
22         p[cnt].from=i;
23         p[cnt].to=N+1;
24         p[cnt++].cost=d;
25         gp[i]=i;
26     }
27     for(i=1;i<=N;i++)
28         for(j=1;j<=N;j++){
29             scanf("%d",&d);
30             if(i==j)
31                 continue;
32             p[cnt].from=i;
33             p[cnt].to=j;
34             p[cnt++].cost=d;
35         }
36     sort(p,p+cnt);
37     for(sum=i=0;i<cnt;i++){
38         if(k==N)
39             break;
40         if(find(p[i].from)!=find(p[i].to)){
41             gp[find(p[i].to)]=find(p[i].from);
42             sum+=p[i].cost;
43             k++;
44         }
45     }
46     printf("%d\n",sum);
47     
48     return 0;
49 }

 

ZJNU 1213 - 取水——高级

标签:高级   struct   find   连接   sum   没有   str   需要   style   

原文地址:https://www.cnblogs.com/stelayuri/p/12233534.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!