POJ:3228-Gold Transportation(要求最小生成树最大边最小)
Gold Transportation
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 3079 Accepted: 1101
Description
Recently, a number of gold mines have been discovered in Zorroming State. To protect this treasure, we must transport this gold to the storehouses as quickly as possible. Suppose that the Zorroming State consists of N towns and there are M bidirectional roads among these towns. The gold mines are only discovered in parts of the towns, while the storehouses are also owned by parts of the towns. The storage of the gold mine and storehouse for each town is finite. The truck drivers in the Zorroming State are famous for their bad temper that they would not like to drive all the time and they need a bar and an inn available in the trip for a good rest. Therefore, your task is to minimize the maximum adjacent distance among all the possible transport routes on the condition that all the gold is safely transported to the storehouses.
Input
The input contains several test cases. For each case, the first line is integer N(1<=N<=200). The second line is N integers associated with the storage of the gold mine in every towns .The third line is also N integers associated with the storage of the storehouses in every towns .Next is integer M(0<=M<=(n-1)*n/2).Then M lines follow. Each line is three integers x y and d(1<=x,y<=N,0
Output
For each case, output the minimum of the maximum adjacent distance on the condition that all the gold has been transported to the storehouses or “No Solution”.
Sample Input
4
3 2 0 0
0 0 3 3
6
1 2 4
1 3 10
1 4 12
2 3 6
2 4 8
3 4 5
0
Sample Output
6
解题心得:
- 题意就是很多个点,每个点有等待放置的金子也有可以储存的金子的量,给你一些边,你选择这些边连接的点的金子可以相互转移,最后需要让所有的金子都能够被储存,并且要求选择出来的边要最大的边最小。
- 这个就是一个最小生成树,记录一个点有的金子为正值,可以储存的值为负值,然后选择边将点连接起来,连接起来的点要将值相加,最后只要所有连接起来的点没有大于0的值就可以停止加边了。
- 关于最大的边最小的问题,可以直接使用Kruskal算法,在Kruskal的算法之中,添加的边都是从小开始添加的,所以使用Kruskal算法,得到的最小生成树最大的边就是最大边中的最小。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1000;
int res[maxn],father[maxn],Sum,n,m;
struct NODE
{
int s,e,len;
} node[maxn*maxn];
bool cmp(NODE a,NODE b)
{
return a.len < b.len;
}
void init()
{
memset(res,0,sizeof(res));
memset(node,0,sizeof(node));
for(int i=0;i<maxn;i++)
father[i] = i;
//有金子的量为正,可以储存的量为负
for(int i=1; i<=n; i++)
scanf("%d",&res[i]);
for(int i=1; i<=n; i++)
{
int x;
scanf("%d",&x);
res[i] -= x;
}
scanf("%d",&m);
for(int i=0; i<m; i++)
scanf("%d%d%d",&node[i].s,&node[i].e,&node[i].len);
sort(node,node+m,cmp);
}
int find(int x)
{
if(x == father[x])
return x;
return father[x] = find(father[x]);
}
bool check()//检查是不是所有的点都是不大于0的
{
for(int i=1;i<=n;i++)
{
int fx = find(i);
if(res[fx] > 0)
return false;
}
return true;
}
void solve()
{
int Max_path = 0;
for(int i=0; i<m; i++)
{
if(check())//如果出现的点全是小于等于0的直接跳出
break;
int s = node[i].s;
int e = node[i].e;
int fx = find(s);
int fy = find(e);
if(fx == fy)
continue;
int len = node[i].len;
if(len > Max_path)
Max_path = len;
int Min = min(res[fx],res[fy]);
int Max = max(res[fx],res[fy]);
father[fx] = fy;
res[fy] = Min+Max;//合并之后将值也合并
}
if(!check())
printf("No Solution\n");
else
printf("%d\n",Max_path);
}
int main()
{
while(cin>>n && n)
{
init();
solve();
}
return 0;
}
POJ:3228-Gold Transportation(要求最小生成树最大边最小)的更多相关文章
- POJ 3228 Gold Transportation
Gold Transportation Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on PKU. Ori ...
- POJ 3228 Gold Transportation(带权并查集,好题)
参考链接:http://www.cnblogs.com/jiaohuang/archive/2010/11/13/1876418.html 题意:地图上某些点有金子,有些点有房子,还有一些带权路径,问 ...
- poj 3228 Gold Transportation 二分+网络流
题目链接 给出n个城市, 每个城市有一个仓库, 仓库有容量限制, 同时每个城市也有一些货物, 货物必须放到仓库中. 城市之间有路相连, 每条路有长度. 因为有些城市的货物量大于仓库的容量, 所以要运到 ...
- POJ 1797 Heavy Transportation 【最大生成树的最小边/最小瓶颈树】
Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand bus ...
- poj 1797 Heavy Transportation(最大生成树)
poj 1797 Heavy Transportation Description Background Hugo Heavy is happy. After the breakdown of the ...
- POJ 1797 Heavy Transportation / SCU 1819 Heavy Transportation (图论,最短路径)
POJ 1797 Heavy Transportation / SCU 1819 Heavy Transportation (图论,最短路径) Description Background Hugo ...
- POJ.1797 Heavy Transportation (Dijkstra变形)
POJ.1797 Heavy Transportation (Dijkstra变形) 题意分析 给出n个点,m条边的城市网络,其中 x y d 代表由x到y(或由y到x)的公路所能承受的最大重量为d, ...
- POJ 3241 Object Clustering 曼哈顿最小生成树
Object Clustering Description We have N (N ≤ 10000) objects, and wish to classify them into severa ...
- 【POJ 2400】 Supervisor, Supervisee(KM求最小权匹配)
[POJ 2400] Supervisor, Supervisee(KM求最小权匹配) Supervisor, Supervisee Time Limit: 1000MS Memory Limit ...
随机推荐
- jquery中使用each遍历。
一直知道each这个方法,但是就是不太明白到底怎么用,今天两个地方都使用了each.真的太高兴了,太有成就感了. 东钿微信平台订单列表页 全部订单之前是按照产调,评估,借款的顺序依次排下来,华总说要按 ...
- Junit-@Annotation-动态代理-类加载器
一.测试单元 概述:用于测试JAVA代码的工具类,已内置在Eclipse中; 格式: 1.在方法的上面添加@Test; 2.对被测试的方法的要求:权限- ...
- ios 设置导航栏背景色
//设置导航栏背景色 如果上面的不好用 就用下面的 [self.navigationController.navigationBar setBackgroundImage:[UIImage image ...
- Android Doze模式源码分析
科技的仿生学无处不在,给予我们启发.为了延长电池是使用寿命,google从蛇的冬眠中得到体会,那就是在某种情况下也让手机进入类冬眠的情况,从而引入了今天的主题,Doze模式,Doze中文是打盹儿,打盹 ...
- 【TensorFlow入门完全指南】神经网络篇·MLP多层感知机
前面的不做过多解释了. 这里定义了两个占位符,各位也知道,在训练时,feed_dict会填充它们. 定义相关网络. 这里是权值矩阵和偏差. 这里是实例化了网络,定义了优化器和损失,和上一篇一样. 最后 ...
- 香港城市大学:全球首创3D打印微型机器人技术 有望作治疗癌症用途
香港城市大学(香港城大)的研究团队开发出了全球首创以磁力控制的3D打印微型机器人,该微型机器人技术能做到在生物体内精准运载细胞到指定的位置.新研发的微型机器人有望应用在治疗癌症的靶向治疗,并为细胞层面 ...
- MySQL基础教程——创建数据库并插入数据
本节将介绍 MySQL 新建数据库,新建表,插入数据以及基本数据类型的相关知识.本节实验将创建一个名为 mysql_shiyan 的数据库,其中有两张表 employee和 department. 1 ...
- CentOS安装RabbitMQ步骤
1.安装gcc yum install gcc 安装 ncurses-devel yum install ncurses-devel 2.安装erlang 下载安装包 http://www.erlan ...
- 关于SpringMVC注解
1.@RequestMapping RequestMapping是一个用来处理请求地址映射的注解(将请求映射到对应的控制器方法中),可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址 ...
- skynet 学习笔记-netpack模块(1)
int luaopen_netpack(lua_State *L) { luaL_checkversion(L); luaL_Reg l[] = { { "pop", lpop } ...