185. [USACO Oct08] 挖水井

185. [USACO Oct08] 挖水井(点击转到COGS)

   输入文件:water.in   输出文件:water.out  
时间限制:1 s   内存限制:128 MB

描述

农夫约翰决定给他的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)。

请确定农夫约翰为了完成浇灌所有的牧场所需的最小的总花费。

题目名称:water

输入格式:

     第1行:一个单独的整数n。

第2..n+1行:第i+1行包含一个单独的整数w_i。

       第n+2..2n+1行:第n+1+i行包含n个用空可分开的整数;其中第j个数是p_ij。

输入样例(file water.in):

4

5

4

4

3

0 2 2 2

2 0 3 3

2 3 0 4

2 3 4 0

输入说明:

这里有4个牧场,修井和修管道的代价如图。

输出格式:

•     第1行:一个单独的整数,表示花费。

输出样例(file water.out):

9

输出说明:

农夫约翰可以在第4个牧场修井,并且将每个牧场和第一个连接起来,这样,花费是3+2+2+2=9。

思路:

将挖水井看成边(连向自己的),利用并查集,求出各最小生成树

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define maxn 123456789
 5 using namespace std;
 6 struct edge
 7 {
 8     int fr,to,w;
 9 }E[100000];//size > 300*300
10 int n,x,tot,num;
11 int w[302],father[302];
12 int find(int x)
13 {
14     if(father[x]!=x) father[x]=find(father[x]);
15     return father[x];
16 }
17 void unionn(int x,int y)
18 {
19     father[x]=y;
20 }
21 void add(int x,int y,int z)
22 {
23     num++;
24     E[num].fr=x;
25     E[num].to=y;
26     E[num].w=z;
27 }
28 bool cmp(const edge &a,const edge &b)
29 {
30     return a.w<b.w;
31 }
32 int main()
33 {
34     freopen("water.in","r",stdin);
35     freopen("water.out","w",stdout);
36     scanf("%d",&n);
37     for(int i=1;i<=n;i++)
38       father[i]=i;
39     for(int i=1;i<=n;i++)
40       scanf("%d",&w[i]);
41     for(int i=1;i<=n;i++)
42       for(int j=1;j<=n;j++)
43       {
44           scanf("%d",&x);
45         if(x)
46           add(i,j,x);
47       }
48     for(int i=1;i<=n;i++)
49     {
50         add(i,n+1,w[i]);//E2:从i向n+1(任一点)挖井的费用(把边存进去) 
51         add(n+1,i,w[i]);//E3:从n+1向i挖井的费用 E2的反图 
52     }
53     sort(E+1,E+num+1,cmp);
54     int k=0;
55     for(int i=1;i<=num;i++)
56     {
57         int r1=find(E[i].fr);
58         int r2=find(E[i].to);
59         if(r1!=r2)
60         {
61             unionn(r1,r2);
62             k++;
63             tot+=E[i].w;
64         }
65         if(k==n)//最小生成树的n-1条边+至少一个水井 
66           break;
67     }
68     printf("%d",tot);    
69     fclose(stdin);fclose(stdout);
70     return 0;
71 }

 

转载于:https://www.cnblogs.com/SovietPower/p/6730644.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值