题意

Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记。把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库。 建造一个水库需要花费Wi(1<=Wi<=100000),连接两块土地需要花费Pij(1<=pij<=100000,pij=pji,pii=0). 计算Farmer John所需的最少代价。

思路

很经典的最小生成树模型……很久没做最小生成树一下子没想出来TAT……

首先得有个水源吧,设个虚节点当水源,然后连向每个土地,权值为建造水库的花费,其他的照常建图,然后求最小生成树就行了。

代码

[cpp]
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#define MID(x,y) ((x+y)/2)
#define MEM(a,b) memset(a,b,sizeof(a))
#define REP(i, begin, end) for (int i = begin; i <= end; i ++)
using namespace std;

const int MAX = 305;
struct edge{
int v, w;
edge(){
}
edge(int _v, int _w){
v = _v;
w = _w;
}
};
struct MST{
vector <edge> adj[MAX];
int dist[MAX];
bool vis[MAX];
priority_queue <pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > PQ;
void init(int n){
for (int i = 0; i <= n; i ++){
adj[i].clear();
vis[i] = false;
}
}
void add_edge(int u, int v, int w){
adj[u].push_back(edge(v, w));
adj[v].push_back(edge(u, w));
}
int solve(int s, int n){
for (int i = 0; i <= n; i ++) dist[i] = 0x3fffffff;
while(!PQ.empty()) PQ.pop();
dist[s] = 0;
PQ.push(make_pair(0, s));
while(!PQ.empty()){
int u = PQ.top().second;
PQ.pop();
vis[u] = true;
for (int i = 0; i < (int)adj[u].size(); i ++){
int v = adj[u][i].v, w = adj[u][i].w;
if (!vis[v] && dist[v] > w){
dist[v] = w;
PQ.push(make_pair(w, v));
}
}
}
int res = 0;
for (int i = 1; i <= n; i ++) res += dist[i];
return res;
}
}prim;
int main(){
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
int n;
scanf("%d", &n);
prim.init(n+1);
for (int i = 1; i <= n; i ++){
int tmp;
scanf("%d", &tmp);
prim.add_edge(n+1, i, tmp);
}
for (int i = 1; i <= n; i ++){
for (int j = 1; j <= n; j ++){
int tmp;
scanf("%d", &tmp);
if (i >= j) continue;
prim.add_edge(i, j, tmp);
}
}
printf("%d\n", prim.solve(n+1, n+1));
return 0;
}
[/cpp]

最新文章

  1. 线性插值&amp;双线性插值&amp;三线性插值
  2. 带后台服务配置的tomcat使用
  3. iOS地图 -- 地理编码和反地理编码
  4. iOS CommonCrypto 对称加密 AES ecb,cbc
  5. jquery.cookie.js使用
  6. 几个常见Win32 API函数
  7. Charles抓包工具的使用
  8. RESEACH PAPER
  9. 【转】Maven实战(九)---模块聚合和继承
  10. C语言标记化结构初始化语法
  11. Locally Weighted Linear Regression 局部加权线性回归-R实现
  12. springboot~openfeign从JSON文件读取数据
  13. sqlalchemy关于时间的数据类型
  14. SQL 在OPENQUERY中使用参数,并作为表查询对象/不允许使用远程表值函数调用。
  15. jquery:获取checked复选框的问题
  16. Git 学习笔记--删除错误提交的commit
  17. F5负载均衡原理(转载)
  18. 使用maven开发MR
  19. 《Python黑帽子:黑客与渗透测试编程之道》 网络基础
  20. E: 无法获得锁 /var/cache/apt/archives/lock - open (11 资源临时不可用)

热门文章

  1. Android java 多线程(三)
  2. 20145337《网络对抗技术》逆向及BOF基础
  3. Android实践项目汇报(总结)-修改
  4. C# 图片和64位编码的转换
  5. Ansible 入门指南 - 常用模块
  6. Java命令使用 jmap,jps,jstack,jstat,jhat,jinfo
  7. SQL Over
  8. 51nod 1050 循环数组最大子段和 单调队列优化DP
  9. 论文笔记之:Continuous Deep Q-Learning with Model-based Acceleration
  10. Git教程摘录