图论500题 ---- 并查集求路径上最大值最小不超过K的点对数 HDU Portal
题目链接
题目大意:
就给你一个图,qqq次询问,问你这个图上有多少对点之间的所以路径上的最大值的最小值不超过kkk?
解题思路:
- 首先我们知道这本质上就是求两个点联通的路径上的最大值最小是多少?
- 那么这个就和并查集有关系了,首先我们知道按照边的权值从小到大排序之后的依次加入图中那么如果两个点联通了那么这个边就是最小的最大值!
- 那么我们怎么统计询问呢?就是离线查询,把询问按照从小到大排序,我们知道实际上答案就是各个联通块里面挑出两个点,因为每次只合并两个联通块,那么我们就可以动态的去维护答案,每次减去要合并的两个联通块,然后再加合并之后的块答案就可以了
时间复杂度O(m+q)O(m+q)O(m+q)
AC代码
#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = 500010;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x)
{x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)
{read(first);read(args...);
}
int n, m, q;
struct Edge {int u, v, w;bool operator < (const Edge & a) const {return w < a.w;}
}edge[maxn];
int ans[maxn];
struct ask {int id, w;bool operator < (const ask & a) const {return w < a.w;}
}qu[maxn];int fa[maxn], siz[maxn];
inline int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);
}int main() {//IOS;while(cin >> n >> m >> q) {for(int i = 1; i <= n; ++ i) fa[i] = i, siz[i] = 1;for(int i = 1; i <= m; ++ i) {int u, v, w;cin >> u >> v >> w;edge[i] = {u,v,w};} sort(edge+1,edge+1+m);for(int i = 1; i <= q; ++ i) {int w;cin >> w;qu[i] = {i,w};}sort(qu+1,qu+1+q);int res = 0;int j = 1;for(int i = 1; i <= m; ++ i) {while(j <= q && qu[j].w < edge[i].w) ans[qu[j++].id] = res;int fv = find(edge[i].v), fu = find(edge[i].u), w = edge[i].w;if(fv != fu) {res -= siz[fv] * (siz[fv] - 1) / 2;res -= siz[fu] * (siz[fu] - 1) / 2;fa[fv] = fu;siz[fu] += siz[fv];res += siz[fu] * (siz[fu] - 1) / 2;} }while(j <= q) ans[qu[j++].id] = res;for(int i = 1; i <= q; ++ i)cout << ans[i] << "\n";}return 0;
}
图论500题 ---- 并查集求路径上最大值最小不超过K的点对数 HDU Portal相关推荐
- 图论500题 ---- 并查集+树形dp+枚举 求解动态的最小生成树 HDU 4126
题目链接 题目大意: 给一图,n个点,m条边,每条边有个花费,给出q条可疑的边,每条边有新的花费,每条可疑的边出现的概率相同,求不能经过原来可疑边(可以经过可疑边新的花费构建的边),注意每次只出现一条 ...
- 图论500题 ---- (枚举+并查集)求图上路径权值差值最小 HDU find the most comfortable road
题目链接 解题思路: 对于两个点的路径假设我们把边按照边权进行排序那么,再把边依次加入图中判断两点的联通性,那么这个边就是两个点联通的最小的最大值,但是最大的最小值怎么找? 因为我们是把边权按照从小到 ...
- UVA - 10048 Audiophobia(Floyd求路径上最大值的最小)
题目&分析: 思路: Floyd变形(见上述紫书分析),根据题目要求对应的改变判断条件来解题. 代码: #include <bits/stdc++.h> #define inf 0 ...
- 图论:并查集求最小环
图论:并查集求最小环 概念: 图.路.环: 一个有向图由G=(N,A)表示,其中N表示节点集,A表示边集边(i,j)为一有序对,i为出发节点,j为终止节点.在无向图中(i,j)与(j,i)一致. 路是 ...
- bzoj4144 [AMPPZ2014]Petrol 图论 最短路 并查集
bzoj4144 [AMPPZ2014]Petrol 图论 最短路 并查集 1.这道题我们主要就是要求出距离一个油站的最近的油站 首先我们dijkstra 求出任意一个点到 离他最近的油站的距离 2. ...
- UVA 1329 Corporative Network(并查集:路径压缩)
UVA 1329 Corporative Network(并查集:路径压缩) 2014年03月09日 00:19:33 阅读数:914 UVA 1329 Corporative Network(并查集 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 数据结构与算法A实验六图论---7-9 最短路径(并查集Dijkstra)
给定一个有N个顶点和E条边的无向图,顶点从0到N−1编号.请判断给定的两个顶点之间是否有路径存在.如果存在,给出最短路径长度. 这里定义顶点到自身的最短路径长度为0. 进行搜索时,假设我们总是从编号最 ...
- 图论500题 ---- 枚举(最短路上的边)+最短路 删掉任意一条边的最长最短路 HDU1595
题目链接 题目大意: 有一城市,这个城市有nnn个地点和mmm条连接他们的路,点的编号是从111到nnn,小X住在111,他想去nnn. 但是最近正在维修公路,也就是说这mmm条路有且只有一条是坏的, ...
最新文章
- 自动生成HTML的一段程序
- (64)句柄表,遍历所有进程的句柄表实现反调试
- android kernel控制台初始化过程
- (*长期更新)软考网络工程师学习笔记——数据链路层与网络层的相关计算题
- 通过OAuth 2.0和Okta构建具有安全的服务器到服务器通信的Spring Boot应用
- 爬虫python名词解释_python爬虫
- request 和 session 获取方法
- 不同修饰符的访问权限(private,缺省(默认即default),protected,public)
- 零基础学python还是c语言-学习python还是c语言?
- HTML的快速写法:Emmet和Haml
- WPF自定义Main函数
- webpack, react项目中利用外部JS库提升效率
- html设置字体 圆体,css font-family字体大合集
- 读宗成庆老师著统计自然语言处理书笔记整理(1)
- W25Q64内部结构
- 开发实现物理加速度移动_2019年最受物理老师欢迎的7款软件发布!不要错过!...
- 排队叫号python编程_一种自主选时排队叫号算法
- 【原创】2019.08.15 模拟赛 ※ [USACO19]Left Out / [USACO19]Cow Steeplechase II / bzoj 4972 小Q的方格纸
- 计算机无法访问,您可能没有权限使用网络资源.请与这台服务器的管理员联系的解决办
- 前端开发最基本的3个语言