ZOJ3659 Conquer a New Region 并查集
Conquer a New Region
Time Limit: 5 Seconds Memory Limit: 32768 KB
The wheel of the history rolling forward, our king conquered a new region in a distant continent.
There are N towns (numbered from 1 to N) in this region connected by several roads. It's confirmed that there is exact one route between any two towns. Traffic is important while controlled colonies are far away from the local country. We define the capacity C(i, j) of a road indicating it is allowed to transport at most C(i, j) goods between town i and town j if there is a road between them. And for a route between i and j, we define a value S(i, j) indicating the maximum traffic capacity between i and j which is equal to the minimum capacity of the roads on the route.
Our king wants to select a center town to restore his war-resources in which the total traffic capacities from the center to the other N - 1 towns is maximized. Now, you, the best programmer in the kingdom, should help our king to select this center.
Input
There are multiple test cases.
The first line of each case contains an integer N. (1 ≤ N ≤ 200,000)
The next N - 1 lines each contains three integers a, b, c indicating there is a road between town a and town b whose capacity is c. (1 ≤ a, b ≤ N, 1 ≤ c ≤ 100,000)
Output
For each test case, output an integer indicating the total traffic capacity of the chosen center town.
Sample Input
- 4
- 1 2 2
- 2 4 1
- 2 3 1
- 4
- 1 2 1
- 2 4 1
- 2 3 1
Sample Output
- 4
- 3
Contest: The 2012 ACM-ICPC Asia Changchun Regional Contest
题意:给你一个树,每条路径都有一个权值,让你找到一个点X,使得任意点与X点这条路上的最小的一个权值之和最大,问你这个最大权值是多少
题解:先排序,然后对个加进来的边的两端a,b子树看作集合A,B,即要么以A集合一端点a为X点,要么B集合一端点b为X点,并查集维护下去,并保存集合的元素个数与答案
到最后对这个整体的集合进行找祖先就好了。
- //
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<string>
- #include<algorithm>
- #include<queue>
- #include<cmath>
- #include<map>
- #include<bitset>
- #include<set>
- #include<vector>
- using namespace std ;
- typedef long long ll;
- #define mem(a) memset(a,0,sizeof(a))
- #define meminf(a) memset(a,127,sizeof(a));
- #define memfy(a) memset(a,-1,sizeof(a))
- #define TS printf("111111\n");
- #define FOR(i,a,b) for( int i=a;i<=b;i++)
- #define FORJ(i,a,b) for(int i=a;i>=b;i--)
- #define READ(a,b) scanf("%d%d",&a,&b)
- #define mod 1000000007
- #define maxn 200000+10
- inline ll read()
- {
- ll x=,f=;
- char ch=getchar();
- while(ch<''||ch>'')
- {
- if(ch=='-')f=-;
- ch=getchar();
- }
- while(ch>=''&&ch<='')
- {
- x=x*+ch-'';
- ch=getchar();
- }
- return x*f;
- }
- //****************************************
- int parent[maxn],n,m,num[maxn];
- ll sum[maxn];
- struct ss
- {
- int u,v,w;
- } edge[maxn];
- void init()
- {
- FOR(i,,n)parent[i]=i;
- mem(sum);
- FOR(i,,n)num[i]=;
- }
- int finds(int x)
- {
- if(x!=parent[x])parent[x]=finds(parent[x]);
- else return x;
- }
- bool cmp(ss s1,ss s2)
- {
- return s1.w>s2.w;
- }
- int main()
- {
- while(scanf("%d",&n)!=EOF)
- {
- init();
- FOR(i,,n-)
- {
- scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
- }
- sort(edge+,edge+n,cmp);
- FOR(i,,n-)
- {
- int A=finds(edge[i].u);
- int B=finds(edge[i].v);
- if(sum[A]+(ll)edge[i].w*num[B]>=sum[B]+(ll)edge[i].w*num[A])
- {
- parent[B]=A;
- num[A]+=num[B];
- sum[A]+=(ll)edge[i].w*num[B];
- }
- else
- {
- parent[A]=B;
- num[B]+=num[A];
- sum[B]+=(ll)edge[i].w*num[A];
- }
- }
- cout<<sum[finds()]<<endl;
- }
- return ;
- }
代码君
ZOJ3659 Conquer a New Region 并查集的更多相关文章
- hdu 4424 & zoj 3659 Conquer a New Region (并查集 + 贪心)
Conquer a New Region Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- hdu4424 Conquer a New Region 并查集/类似最小生成树
The wheel of the history rolling forward, our king conquered a new region in a distant continent.The ...
- ZOJ 3659 & HDU 4424 Conquer a New Region (并查集)
这题要用到一点贪心的思想,因为一个点到另一个点的运载能力决定于其间的边的最小权值,所以先把线段按权值从大到小排个序,每次加的边都比以前小,然后合并集合时,比较 x = findset(a) 做根或 y ...
- zoj 3659 Conquer a New Region(并查集)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4882 代码: #include<cstdio> #inc ...
- hdu 4424 Conquer a New Region (并查集)
///题意:给出一棵树.树的边上都有边权值,求从一点出发的权值和最大,权值为从一点出去路径上边权的最小值 # include <stdio.h> # include <algorit ...
- UVa 1664 Conquer a New Region(并查集)
https://vjudge.net/problem/UVA-1664 题意: n个城市形成一棵树,每条边有权值C(i,j).任意两个点的容量S(i,j)定义为i与j唯一通路上容量的最小值.找一个点, ...
- UVA 1664 Conquer a New Region (并查集+贪心)
并查集的一道比较考想法的题 题意:给你n个点,接着给你n-1条边形成一颗生成树,每条边都有一个权值.求的是以一个点作为特殊点,并求出从此点出发到其他每个点的条件边权的总和最大,条件边权就是:起点到终点 ...
- 【转】并查集&MST题集
转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基 ...
- zoj 3659 Conquer a New Region The 2012 ACM-ICPC Asia Changchun Regional Contest
Conquer a New Region Time Limit: 5 Seconds Memory Limit: 32768 KB The wheel of the history roll ...
随机推荐
- 11-3 re模块
目录 r 的作用 re模块的常用功能 findall search match split sub 将数字替换成'H' subn 将数字替换成'H',返回元组(替换的结果,替换了多少次) compil ...
- mysql图形化工具获取表的源码
打开数据库,选择要查看的表,点击右键>对象信息>DDL:
- ES5和ES6新的操作数组的方法(常用)
// 普通的for循环// var arr = ['张飞', '赵云', '马超', '刘备']// for (var i = 0; i < arr.length; i++) {// conso ...
- vue props传值方法
<template> <div class="hello"> <ul> <li v-for="(item, index) in ...
- ZOJ - 3204 Connect them 最小生成树
Connect them ZOJ - 3204 You have n computers numbered from 1 to n and you want to connect them to ma ...
- mysql8忘记登录密码时,修改密码方法
一.停止mysqld进程 systemctl stop mysqld.service 二.修改/etc/my.cnf(在mysqld选项添加skip-grant-tables),设置免密码登录: vi ...
- UVa 122 树的层次遍历
题意: 给定一颗树, 按层次遍历输出. 分析: 用数组模拟二叉树, bfs即可实现层次遍历 #include <bits/stdc++.h> using namespace std; st ...
- 图论算法——最短路径Dijkstra,Floyd,Bellman Ford
算法名称 适用范围 算法过程 Dijkstra 无负权 从s开始,选择尚未完成的点中,distance最小的点,对其所有边进行松弛:直到所有结点都已完成 Bellman-Ford 可用有负权 依次对所 ...
- word 给段落添加背景色
word 2007 单击"页面布局"选项卡->单击"页面背景"一栏中的"页面边框"->(弹出边框与底纹对话框)->点击底纹 ...
- CentOS7 Firewall防火墙配置用法详解
centos 7中防火墙是一个非常的强大的功能了,但对于centos 7中在防火墙中进行了升级了,下面我们一起来详细的看看关于centos 7中防火墙使用方法. FirewallD 提供了支持网络 ...