ECNU 3462 最小 OR 路径 (贪心 + 并查集)
题目链接 EOJ Monthly 2018.1 Problem F
先假设答案的每一位都是$1$,然后从高位开始,选出那些该位置上为$0$的所有边,并查集判断连通性。
如果$s$和$t$可以连通的话,那么该位置$0$,然后用刚刚选出来的这些边再继续做下去。
如果$s$和$t$不连通的话,那么不做任何操作,继续处理低位。
这样就可以保证答案一定是最小的。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL; const int N = 1e4 + 10;
const int M = 1e6 + 10; struct node{
int x, y;
LL z;
void scan(){ scanf("%d%d%lld", &x, &y, &z);}
} e[M]; int n, m, s, t;
int x;
int father[N];
vector <node> f[2];
LL ans; int getfather(int x){
return father[x] ? father[x] = getfather(father[x]) : x;
} int main(){ scanf("%d%d", &n, &m);
rep(i, 1, m) e[i].scan(); scanf("%d%d", &s, &t);
ans = (1ll << 62) - 1; rep(i, 1, m){
int x = e[i].x, y = e[i].y;
int fx = getfather(x), fy = getfather(y);
if (fx ^ fy){
father[fx] = fy;
}
} if (getfather(s) != getfather(t)) return 0 * puts("-1"); x = 0;
rep(i, 1, m) f[0].push_back(e[i]);
dec(i, 61, 0){
memset(father, 0, sizeof father);
f[x ^ 1].clear();
for (auto edge : f[x]){
LL val = edge.z;
if (!((1ll << i) & val)){
f[x ^ 1].push_back(edge);
}
} for (auto edge : f[x ^ 1]){
int x = edge.x, y = edge.y;
int fx = getfather(x), fy = getfather(y);
if (fx ^ fy) father[fx] = fy;
} int fs = getfather(s), ft = getfather(t);
if (fs == ft){
ans ^= (1ll << i);
x ^= 1;
}
} printf("%lld\n", ans);
return 0;
}
ECNU 3462 最小 OR 路径 (贪心 + 并查集)的更多相关文章
- POJ 1456 Supermarket(贪心+并查集)
题目链接:http://poj.org/problem?id=1456 题目大意:有n件商品,每件商品都有它的价值和截止售卖日期(超过这个日期就不能再卖了).卖一件商品消耗一个单位时间,售卖顺序是可以 ...
- bzoj1050[HAOI2006]旅行comf(枚举+贪心+并查集)
Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...
- 计蒜客 444 / xtuoj 1024 京东的物流路径(并查集+离线lca)或者 (点分治)
题意:一颗树,定义一条路径的权值等于路径的边权之和,需要求这颗树所有路径中权值的最大值 思路: 考虑到路径权值与点权的最值有关,而最值的问题通常可以通过排序就行处理,于是想到先把点权排序. 容易看出如 ...
- Codeforces 437D The Child and Zoo(贪心+并查集)
题目链接:Codeforces 437D The Child and Zoo 题目大意:小孩子去參观动物园,动物园分非常多个区,每一个区有若干种动物,拥有的动物种数作为该区的权值.然后有m条路,每条路 ...
- poj1456 Supermarket 贪心+并查集
题目链接:http://poj.org/problem?id=1456 题意:有n个物品(0 <= n <= 10000) ,每个物品有一个价格pi和一个保质期di (1 <= pi ...
- GYM 101173 F.Free Figurines(贪心||并查集)
原题链接 题意:俄罗斯套娃,给出一个初始状态和终止状态,问至少需要多少步操作才能实现状态转化 贪心做法如果完全拆掉再重装,答案是p[i]和q[i]中不为0的值的个数.现在要求寻找最小步数,显然要减去一 ...
- codevs1001 舒适的路线 - 贪心 - 并查集
题目描述 Description Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N(1<N≤500)个景点(编号为1,2,3,…,N),这些景点被M(0<M≤ ...
- POJ 1456——Supermarket——————【贪心+并查集优化】
Supermarket Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- 洛谷 P1525 关押罪犯 NOIp2010提高组 (贪心+并查集)
题目链接:https://www.luogu.org/problemnew/show/P1525 题目分析 通过分析,我们可以知道,这道题的抽象意义就是把一个带边权的无向图,分成两个点集,使得两个集合 ...
随机推荐
- 《Cracking the Coding Interview》——第13章:C和C++——题目5
2014-04-25 19:59 题目:C的关键字volatile有什么用? 解法:搞硬件设计的人好像更关注这个关键字.volatile本身是易变的意思,应该和persistent有反义词关系吧.说一 ...
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目6
2014-03-20 03:27 题目:输出所有由N对括号组成的合法的括号序列.比如n=2,“()()”.“(())”等等. 解法:动态规划配合DFS,应该也叫记忆化搜索吧.一个整数N总可以拆成若干个 ...
- android surfaceview 入门介绍
由于工作中需自定义控件,以前没写过. 开始时,实用view 实现了,经理说不好,担心效率低,要求每秒需要刷新10次左右. 然后,学习使用 surfaceview. 看了网上简单的Demo,找到him ...
- 开源api文档
蒲公英——API文档 https://www.pgyer.com/doc/api
- Windows环境下,python webdriver环境搭建
最近刚开始学习selenium,这是我从虫师的<selenium2自动测试实战--基于Python语言>这本书上学到搭建环境的步骤,里面有加上我的一些总结,希望对大家有所帮助! 准备工 ...
- [转载]unity优化1
官方优化文档--优化图像性能http://docs.unity3d.com/Documentation/Manual/OptimizingGraphicsPerformance.html Unity3 ...
- 计算机图形学 opengl版本 第三版------胡事民 第四章 图形学中的向量工具
计算机图形学 opengl版本 第三版------胡事民 第四章 图形学中的向量工具 一 基础 1:向量分析和变换 两个工具 可以设计出各种几何对象 点和向量基于坐标系定义 拇指指向z轴正 ...
- mysql5.6版本修改密码
UPDATE user SET Password=PASSWORD('新密码') WHERE User='root';
- python基础--用python执行系统命令
from os import system print(system('ping www.baidu.com'))
- 201621123034 《Java程序设计》第14周学习总结
作业14-数据库 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截 ...