bzoj 2096 [POI2004]ZAW——二进制枚举
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2069
可以把直接相连的点分成 从1点出的一部分 和 走向1点的一部分。多起点最短路就和正常的差不多。
怎么分才能不漏掉答案?按点的编号二进制每一位是0还是1分成两部分。因为两两编号不同,所以每两个总有一次被分到不同的集合。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int N=5005,M=1e4+5,lm=17; int n,m,hd[N],xnt=1,to[M<<1],nxt[M<<1],w[M<<1]; int fr[N],cnt,dis[N],ans=0x3f3f3f3f; bool vis[N],st[N]; priority_queue<pair<int,int> > q; void add(int x,int y,int z0,int z1) {to[++xnt]=y;nxt[xnt]=hd[x];w[xnt]=z0;hd[x]=xnt;to[++xnt]=x;nxt[xnt]=hd[y];w[xnt]=z1;hd[y]=xnt;if(x==1)fr[++cnt]=xnt-1;if(y==1)fr[++cnt]=xnt; } void dj() {memset(dis,0x3f,sizeof dis);memset(vis,0,sizeof vis);vis[1]=1;for(int i=1;i<=cnt;i++) if(st[i])dis[to[fr[i]]]=w[fr[i]],q.push(make_pair(-dis[to[fr[i]]],to[fr[i]]));while(q.size()){int k=q.top().second;q.pop();while(vis[k]&&q.size())k=q.top().second,q.pop();if(vis[k])break;vis[k]=1;for(int i=hd[k],v;i;i=nxt[i])if(!vis[v=to[i]]&&dis[v]>dis[k]+w[i])dis[v]=dis[k]+w[i],q.push(make_pair(-dis[v],v));} } int main() {scanf("%d%d",&n,&m);for(int i=1,x,y,z0,z1;i<=m;i++){scanf("%d%d%d%d",&x,&y,&z0,&z1);add(x,y,z0,z1);}for(int i=0;i<=lm;i++){int bin=(1<<i);for(int j=1;j<=cnt;j++)if(to[fr[j]]&bin) st[j]=1; else st[j]=0;dj();for(int j=1;j<=cnt;j++){if(!st[j]) ans=min(ans,dis[to[fr[j]]]+w[fr[j]^1]);st[j]=!st[j];}dj();for(int j=1;j<=cnt;j++) if(!st[j])ans=min(ans,dis[to[fr[j]]]+w[fr[j]^1]);}printf("%d\n",ans);return 0; }
转载于:https://www.cnblogs.com/Narh/p/9489592.html
bzoj 2096 [POI2004]ZAW——二进制枚举相关推荐
- BZOJ 2069: [POI2004]ZAW(Dijkstra + 二进制拆分)
题意 给定一个有 \(N\) 个点 \(M\) 条边的无向图, 每条无向边 最多只能经过一次 . 对于边 \((u, v)\) , 从 \(u\) 到 \(v\) 的代价为 \(a\) , 从 \(v ...
- BZOJ.2069.[POI2004]ZAW(最短路Dijkstra 按位划分)
题目链接 \(Description\) 给定一张带权图(边是双向的,但不同方向长度不同).求从1出发,至少经过除1外的一个点,再回到1的最短路.点和边不能重复经过. \(n\leq5000,m\le ...
- BZOJ 2069 POI2004 ZAW 堆优化Dijkstra
题目大意:给定一张无向图,每条边从两个方向走各有一个权值,求从点1往出走至少一步之后回到点1且不经过一条边多次的最短路 显然我们需要从点1出发走到某个和点1相邻的点上,然后沿最短路走到另一个和点1相邻 ...
- 【刷题】BZOJ 2069 [POI2004]ZAW
Description 在Byte山的山脚下有一个洞穴入口. 这个洞穴由复杂的洞室经过隧道连接构成. 洞穴的入口是一条笔直通向"前面洞口"的道路. 隧道互相都不交叉(他们只在洞室相 ...
- 2069: [POI2004]ZAW
2069: [POI2004]ZAW 链接 题意: 给定一张带权图(边是双向的,但不同方向长度不同).求从1出发,至少经过除1外的一个点,再回到1的最短路.点和边不能重复经过. n≤5000,m≤10 ...
- [BZOJ2069][POI2004]ZAW
BZOJ2069 描述 在Byte山的山脚下有一个洞穴入口. 这个洞穴由复杂的洞室经过隧道连接构成. 洞穴的入口是一条笔直通向"前面洞口"的道路. 隧道互相都不交叉(他们只在洞室相 ...
- HPU组队赛B:问题(二进制枚举)
时间限制1 Second 内存限制 512 Mb 题目描述 你有n个问题,你已经估计了第i个问题的难度为Ci,现在你想使用这些问题去构造一个问题集.比赛的问题集必须包含至少两个问题,而且比赛的总难度必 ...
- BZOJ1688|二进制枚举子集| 状态压缩DP
Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...
- 116. 飞行员兄弟【二进制枚举】
二进制枚举即可,需要注意的是,这道题和费解的开关还是有不同点的. 费解的开关枚举第一行就行了,因为它有依赖关系的. 而这个是一个十字形,无那种关系.故直接暴力枚举邓按不按的所有情况即可. #inclu ...
最新文章
- C#计时器,记录程序运行时长
- 如何解决关键基础设施网络安全困境?
- (Mybatis)缓存
- 青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 3
- python-opencv怎样找到要跟踪对象的HSV
- BUUCTF-Reverse:reverse2
- 【渝粤题库】陕西师范大学700007 生态学
- Pandas时序数据处理入门
- 在iOS设备上如何使用Chrome浏览器的书签
- php 伪造请求连接,phpcurl发送伪造请求
- stylegan-encoder代码执行步骤和解释
- python编程入门-编程零基础应当如何开始学习 Python?
- JAVA JDK 、Maven、IDEA安装
- ASP.NET:创建Linked ValidationSummary, 深入理解ASP.NET的Validation
- 国二office计算机基础知识,国二office计算机基础知识选择题
- 林家栋这三十年:深获万梓良、刘德华赏识,靠配角成为影帝
- Fetcher failure for URL: ‘gitsm://github.com/Xilinx/qemu.git;protocol=https petalinux build 问题
- 【NLP】⚠️学不会打我! 半小时学会基本操作 8⚠️ 新闻分类
- 五分钟带你了解《操作系统原理》
- STM32学习总结——UART