最优生成树 挖井
来源:互联网 发布:dnf决战人工智能d 编辑:程序博客网 时间:2024/06/05 05:59
【问题描述】
FJ决定给他分别用1到N编号的牧草浇水,他可以直接在一颗牧草旁边直接挖一口井来获得水,也可以用管子从任意有水的牧草那里来获得水。
在第i颗牧草旁边挖一口井的代价为Wi(),用管子连接第i与第j颗牧草的代价为Pij( Pij=Pji; Pii=0)。请求出FJ浇灌这些牧草花费的最小代价。
【输入格式】
第一行,一个整数N。第二行到第N+1行,行i+1表示Wi。
第N+2行到第2N+1行,行N+1+i包含N个用空格分隔开来的整数,每行第j个数字即是Pij。
【输出格式】
仅一行,FJ浇灌这些牧草的最小代价。
【输入样例】
4
5
4
4
3
0 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0
【输出样例】
9
【数据范围】
1<=N<=300
1<=W_i<=100,000
1 <= Pij <= 100,000
把点带权转化成边带权:在i点挖井的代价可以转化成一个不存在的n+1号牧草到i点通管子的代价,转化完成后就可以进行常规的计算最小生成树的边权和。
#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<cmath>#define maxn 10005using namespace std;struct data{ int a,b,l;};int n,m,x,y;int fa[maxn];vector<data>g;bool cmp(data a,data b){ return a.l<b.l;}void clear(){ for(int i=1;i<=n;i++) fa[i]=i;}int find(int x){ if(fa[x]==x) return x; int t=find(fa[x]); fa[x]=t; return t;}void Union(int x,int y){ fa[find(x)]=find(y);}bool check(int x,int y){ return find(x)==find(y);}int main(){ //freopen("in.txt","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&x); g.push_back((data){i,n+1,x}); } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { scanf("%d",&x); if(i<=j) g.push_back((data){i,j,x}); } clear(); sort(g.begin(),g.end(),cmp); int num=0,ans=0; for(int i=0;i<g.size();i++) { int p=g[i].a,q=g[i].b; if(check(p,q)) continue; if(num==n) break; Union(p,q); ans+=g[i].l; num++; } printf("%d",ans); return 0;}
0 0
- 最优生成树 挖井
- 最优比率生成树
- 最优比率生成树
- 最优比率生成树
- 最优比率生成树
- 最优比率生成树
- 生成最优归并树
- 最优比例生成树
- 最优比例生成树
- 最优比率生成树 (最优比例生成树)
- pku2728 最优比率生成树
- 最优比例生成树问题
- POJ2728最优比率生成树
- poj2728最优比率生成树
- poj2728+最优比率生成树
- poj2728(最优比率生成树)
- 01规划 最优比例生成树&最优比例环
- POJ2728Desert King 最优比率生成树
- windows下spark开发环境配置
- c/c++键盘输入
- windows7 64下安装xgboost
- Gym 100989F STL
- 基础备忘[Join]
- 最优生成树 挖井
- 在了解VR的途中看到文章
- ListView嵌套ListView,ScrollView嵌套ListView
- python用箱型图进行异常值检测
- ios面试题
- Xcode查看CoreData的SQL语句
- CSS3嵌套立方体旋转
- 使用python下载网易云课堂中Andrew Ng的机器学习课程
- iOS真机测试详细步骤及图解