题目: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——二进制枚举相关推荐

  1. BZOJ 2069: [POI2004]ZAW(Dijkstra + 二进制拆分)

    题意 给定一个有 \(N\) 个点 \(M\) 条边的无向图, 每条无向边 最多只能经过一次 . 对于边 \((u, v)\) , 从 \(u\) 到 \(v\) 的代价为 \(a\) , 从 \(v ...

  2. BZOJ.2069.[POI2004]ZAW(最短路Dijkstra 按位划分)

    题目链接 \(Description\) 给定一张带权图(边是双向的,但不同方向长度不同).求从1出发,至少经过除1外的一个点,再回到1的最短路.点和边不能重复经过. \(n\leq5000,m\le ...

  3. BZOJ 2069 POI2004 ZAW 堆优化Dijkstra

    题目大意:给定一张无向图,每条边从两个方向走各有一个权值,求从点1往出走至少一步之后回到点1且不经过一条边多次的最短路 显然我们需要从点1出发走到某个和点1相邻的点上,然后沿最短路走到另一个和点1相邻 ...

  4. 【刷题】BZOJ 2069 [POI2004]ZAW

    Description 在Byte山的山脚下有一个洞穴入口. 这个洞穴由复杂的洞室经过隧道连接构成. 洞穴的入口是一条笔直通向"前面洞口"的道路. 隧道互相都不交叉(他们只在洞室相 ...

  5. 2069: [POI2004]ZAW

    2069: [POI2004]ZAW 链接 题意: 给定一张带权图(边是双向的,但不同方向长度不同).求从1出发,至少经过除1外的一个点,再回到1的最短路.点和边不能重复经过. n≤5000,m≤10 ...

  6. [BZOJ2069][POI2004]ZAW

    BZOJ2069 描述 在Byte山的山脚下有一个洞穴入口. 这个洞穴由复杂的洞室经过隧道连接构成. 洞穴的入口是一条笔直通向"前面洞口"的道路. 隧道互相都不交叉(他们只在洞室相 ...

  7. HPU组队赛B:问题(二进制枚举)

    时间限制1 Second 内存限制 512 Mb 题目描述 你有n个问题,你已经估计了第i个问题的难度为Ci,现在你想使用这些问题去构造一个问题集.比赛的问题集必须包含至少两个问题,而且比赛的总难度必 ...

  8. BZOJ1688|二进制枚举子集| 状态压缩DP

    Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...

  9. 116. 飞行员兄弟【二进制枚举】

    二进制枚举即可,需要注意的是,这道题和费解的开关还是有不同点的. 费解的开关枚举第一行就行了,因为它有依赖关系的. 而这个是一个十字形,无那种关系.故直接暴力枚举邓按不按的所有情况即可. #inclu ...

最新文章

  1. C#计时器,记录程序运行时长
  2. 如何解决关键基础设施网络安全困境?
  3. (Mybatis)缓存
  4. 青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 3
  5. python-opencv怎样找到要跟踪对象的HSV
  6. BUUCTF-Reverse:reverse2
  7. 【渝粤题库】陕西师范大学700007 生态学
  8. Pandas时序数据处理入门
  9. 在iOS设备上如何使用Chrome浏览器的书签
  10. php 伪造请求连接,phpcurl发送伪造请求
  11. stylegan-encoder代码执行步骤和解释
  12. python编程入门-编程零基础应当如何开始学习 Python?
  13. JAVA JDK 、Maven、IDEA安装
  14. ASP.NET:创建Linked ValidationSummary, 深入理解ASP.NET的Validation
  15. 国二office计算机基础知识,国二office计算机基础知识选择题
  16. 林家栋这三十年:深获万梓良、刘德华赏识,靠配角成为影帝
  17. Fetcher failure for URL: ‘gitsm://github.com/Xilinx/qemu.git;protocol=https petalinux build 问题
  18. 【NLP】⚠️学不会打我! 半小时学会基本操作 8⚠️ 新闻分类
  19. 五分钟带你了解《操作系统原理》
  20. STM32学习总结——UART

热门文章

  1. 企业微信官方认证的好处是什么?
  2. Windows任意文件读取漏洞
  3. Greenplum 实时数据仓库实践(8)——事实表技术
  4. 2014522420145238 《信息安全系统设计基础》第二次实验
  5. 对话推荐CRS论文精读KBRD:Towards Knowledge-Based Recommender Dialog System
  6. Spring Web Flow 2中的流管理持久性
  7. Linux/服务器中文件下载
  8. 学习Java软件编程哪个机构好
  9. 数据结构之排序:直接插入排序
  10. qt 打印 刻度尺 曲线 复杂图像