luogu P1550 [USACO08OCT]打井Watering Hole

题目背景

John的农场缺水了!!!

题目描述

Farmer John has decided to bring water to his N (1 <= N <= 300) pastures which are conveniently numbered 1..N. He may bring water to a pasture either by building a well in that pasture or connecting the pasture via a pipe to another pasture which already has water.

Digging a well in pasture i costs W_i (1 <= W_i <= 100,000).

Connecting pastures i and j with a pipe costs P_ij (1 <= P_ij <= 100,000; P_ij = P_ji; P_ii=0).

Determine the minimum amount Farmer John will have to pay to water all of his pastures.

POINTS: 400

农民John 决定将水引入到他的n(1<=n<=300)个牧场。他准备通过挖若

干井,并在各块田中修筑水道来连通各块田地以供水。在第i 号田中挖一口井需要花费W_i(1<=W_i<=100,000)元。连接i 号田与j 号田需要P_ij (1 <= P_ij <= 100,000 , P_ji=P_ij)元。

请求出农民John 需要为连通整个牧场的每一块田地所需要的钱数。

输入输出格式

输入格式:

第1 行为一个整数n。

第2 到n+1 行每行一个整数,从上到下分别为W_1 到W_n。

第n+2 到2n+1 行为一个矩阵,表示需要的经费(P_ij)。

输出格式:

只有一行,为一个整数,表示所需要的钱数。

输入输出样例

输入样例#1:

4
5
4
4
3
0 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0

输出样例#1:

9

说明

John等着用水,你只有1s时间!!!

开始给dis赋值打井花费来比较打井和修水道哪种更优

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 int f[310][310],dis[310];
 6 bool vis[310];
 7 int main()
 8 {
 9     memset(f,0x3f,sizeof(f));
10     memset(dis,0x3f,sizeof(dis));
11     int n;
12     scanf("%d",&n);
13     for(int i=1;i<=n;++i)
14         scanf("%d",&dis[i]);
15     for(int i=1;i<=n;++i)
16         for(int j=1;j<=n;++j)
17             scanf("%d",&f[i][j]);
18     for(int i=1;i<=n;++i)
19     {
20         int k=0;
21         for(int j=1;j<=n;++j)
22             if(!vis[j]&&dis[j]<dis[k])
23                 k=j;
24         vis[k]=1;
25         for(int j=1;j<=n;++j)
26             if(j!=k&&!vis[j]&&dis[j]>f[k][j])
27                 dis[j]=f[k][j];
28     }
29     int ans=0;
30     for(int i=1;i<=n;++i)
31         ans+=dis[i];
32     printf("%d",ans);
33     return 0;
34 }

原文地址:https://www.cnblogs.com/axma/p/9356912.html

时间: 2024-11-01 10:34:37

luogu P1550 [USACO08OCT]打井Watering Hole的相关文章

P1550 [USACO08OCT]打井Watering Hole

P1550 [USACO08OCT]打井Watering Hole 题目比较简单,却提醒了图论建图的的重要性. 很多时候建图不只是要将给定的信息建立,还需要添加辅助点. 不过这题是真水 #include<cstdio> #include<algorithm> #include<iostream> #include<cstring> using std::sort; const int maxn=500; struct node { int A,B; int

题解 P1550 【[USACO08OCT]打井Watering Hole】

题面(翻译有点问题,最后一句话) 农民John 决定将水引入到他的n(1<=n<=300)个牧场.他准备通过挖若 干井,并在各块田中修筑水道来连通各块田地以供水.在第i 号田中挖一口井需要花费W_i(1<=W_i<=100,000)元.连接i 号田与j 号田需要P_ij (1 <= P_ij <= 100,000 , P_ji=P_ij)元. 请求出农民John 需要为使所有农场都与有水的农场相连或拥有水井所需要的钱数. 题意 有n个点,每个点之间都有边权,但是每个点也

[USACO08OCT]:打井Watering Hole(MST)

题意:有N个牧场,每个牧场修水井花费Wi,连接牧场花费Pij,问最小花费,使得每个牧场要么有水井,要么和有水井的牧场有通道. 思路:加一个格外的节点O,连接O表示修井,边权是修井的费用.     那么这N+1个点求最MST即可. 刘同学想到的解法: 先找到修井费用最低的的牧场,然后和上面一样,由于最低的那个必选,所以异曲同工. #include<bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace

『USACO08OCT]』Watering Hole

题面 code 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,cnt,ans,fa[305]; 4 struct edge{int x,y,v;}e[100005]; 5 inline int read() { 6 int x=0,f=1; char c=getchar(); 7 while(c<'0'||c>'9') {if(c=='-')f=-1; c=getchar();} 8 while(c>='0'

usaco oct09 Watering Hole

Farmer John希望把水源引入他的N (1 <= N <= 300) 个牧场,牧场的编号是1~N.他将水源引入某个牧场的方法有两个,一个是在牧场中打一口井,另一个是将这个牧场与另一个已经有水源的牧场用一根管道相连.在牧场i中打井的费用是W_i (1 <= W_i <= 100000).把牧场i和j用一根管道相连的费用是P_ij (1 <= P_ij <= 100000, P_ij = P_ji, P_ii = 0).请你求出Farmer John最少要花多少钱才能

USACO 2008 Watering hole Prim

题目 题目描述 Farmer John has decided to bring water to his N (1 <= N <= 300) pastures which are conveniently numbered 1..N. He may bring water to a pasture either by building a well in that pasture or connecting the pasture via a pipe to another pasture

HDU 2887 Watering Hole(MST + 倍增LCA)

传送门 总算是做上一道LCA的应用题了... 题意:有$n$个牧场, $m$根管道分别连接编号为$u,v$的牧场花费$p_{i}$,在第$i$个牧场挖口井需要花费$w_{i}$,有$P$根管道直接连通着$u,v$,即免费连上$u,v$ 对每根免费管道输出让所有牧场都有水的最小花费 先是最小生成树,用0去连每一个点,边权就是每个点的权值,然后正常建,跑一遍最小生成树,把用到的边重新建一次图,然后就对每次询问的$u,v$,减掉他们之间的路径的最长边就是答案了 因为删去这其中一条边,再免费连上$u,v

【题解】Luogu P2212 [USACO14MAR] 浇地 Watering the Fields 最小生成树

裸的板子,判一下d和c的大小 我菜死了,kruskal写挂的原因竟然是,sort的范围错了 WA到爆了 kruskal都忘了怎么写,赶快滚去复习 code 1 #include <bits/stdc++.h> 2 using namespace std; 3 namespace gengyf{ 4 #define ll long long 5 const int maxn=1e6+10; 6 inline int read(){ 7 int x=0,f=1; 8 char c=getchar(

并查集题目整理

并查集 之前写最小生成树的时候对这一部分的知识也并没有十分详细的整理 近天做了一些用到并查集的题目,来整理一下 知识回顾 首先,先来回顾一下有关并查集的内容 <1> 定义 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并. <2>初始化 把每个点所在集合初始化为其自身. 通常来说,这个步骤在每次使用该数据结构时只需要执行