POJ3228 Gold Transportation 解题报告【贪心+并查集=Kruskal?】
2017-10-12 20:09
441 查看
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.
![](http://img.blog.csdn.net/20171012200331895?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGhlbGp0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
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 < d<=10000), means that there is a road between x and y for distance of d. N=0 means end of the input.
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
解题报告
这道题的题意是有n个村落,m条道路,每个村落有一定的金矿存量和仓库容量,问把所有金矿全部装进仓库里所要经过的所有路线中边权最大值中最小的那个。
我们首先要想一想怎样的情况可以叫做“所有的金矿都可以装进仓库里”。那必然是讲,对于经过调配后的每一个村庄中的金矿存量都要小于其仓库容量。
我们借用kruskal中贪心的思想,但是需要把并查集开成带权并查集,在形似kruskal的贪心地排序+贪心地选边的过程中,合并一条边的两个端点时顺带把两个权值一起合并了,再加以判断就行了。
代码如下:
ps:听说可以用二分+最大流做?
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 < d<=10000), means that there is a road between x and y for distance of d. N=0 means end of the input.
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
解题报告
这道题的题意是有n个村落,m条道路,每个村落有一定的金矿存量和仓库容量,问把所有金矿全部装进仓库里所要经过的所有路线中边权最大值中最小的那个。
我们首先要想一想怎样的情况可以叫做“所有的金矿都可以装进仓库里”。那必然是讲,对于经过调配后的每一个村庄中的金矿存量都要小于其仓库容量。
我们借用kruskal中贪心的思想,但是需要把并查集开成带权并查集,在形似kruskal的贪心地排序+贪心地选边的过程中,合并一条边的两个端点时顺带把两个权值一起合并了,再加以判断就行了。
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=200,M=20000; struct edge { int u,v,w; }ed[M+5]; int n,m; int w[N+5],s[N+5],father[N+5]; int answ,anss,ans; bool cmp(edge a,edge b){return a.w<b.w;} int find(int a){return father[a]==a?a:father[a]=find(father[a]);} bool check() { for(int i=1;i<=n;i++) { int u=find(i); if(s[u]<w[u])return false; } return true; } void kruskal() { for(int i=1;i<=m;i++) { int u=ed[i].u,v=ed[i].v; u=find(u),v=find(v); if(u==v)continue; father[u]=v; w[v]+=w[u],w[u]=0; s[v]+=s[u],s[u]=0; ans=ed[i].w; if(check())return ; } } int main() { while(~scanf("%d",&n)) { answ=0,anss=0; if(!n)break; for(int i=1;i<=n;i++)father[i]=i; for(int i=1;i<=n;i++)scanf("%d",&w[i]),answ+=w[i]; for(int i=1;i<=n;i++)scanf("%d",&s[i]),anss+=s[i]; if(answ>anss){printf("No Solution\n");continue;} scanf("%d",&m); for(int i=1;i<=m;i++)scanf("%d%d%d",&ed[i].u,&ed[i].v,&ed[i].w); if(check()){printf("0\n");continue;} sort(ed+1,ed+1+m,cmp); kruskal(); if(check())printf("%d\n",ans); else printf("No Solution\n"); } return 0; }
ps:听说可以用二分+最大流做?
相关文章推荐
- poj 3228 Gold Transportation 最小生成树+带权并查集 解题报告
- poj 1182 食物链(并查集)解题报告(转)
- 2018.1.21【POJ - 1328】小岛与雷达解题报告(二维转一维,贪心)
- 【原】 POJ 1308 Is It A Tree? 并查集树结构 解题报告
- POJ - 3026 Borg Maze解题报告(Kruskal+Bfs)
- PKU POJ 1611解题报告(并查集)
- 【解题报告】 POJ 1611 The Suspects 并查集基础 (一点自己的感悟)
- PKU POJ 2524 解题报告(并查集)
- poj 1182 食物链(并查集)解题报告(转)
- POJ 2524 Ubiquitous Religions 解题报告(并查集)
- 解题报告:POJ_1703Find them, Catch them 并查集
- poj 1417 True Liars 解题报告 并查集 DP
- 【解题报告】 HDU 1879 继续畅通工程 并查集 + 贪心
- 【原】 POJ 1611 The Suspects 并查集 解题报告
- poj 1733 Parity game 并查集 解题报告
- bzoj 1854 游戏 并查集+贪心 解题报告
- poj 1984 Navigation Nightmare 并查集 解题报告
- poj 3728 LCA+并查集 解题报告
- (贪心+并查集) poj 3228
- POJ 1182 并查集 解题报告