BZOJ 2069 POI2004 ZAW 堆优化Dijkstra
题目大意:给定一张无向图。每条边从两个方向走各有一个权值,求从点1往出走至少一步之后回到点1且不经过一条边多次的最短路
显然我们须要从点1出发走到某个和点1相邻的点上,然后沿最短路走到还有一个和点1相邻的点上,然后回到点1
那么我们将与点1相邻的点都设为关键点。然后将点1从图中删除。题目转化成了给定图上的一些关键点求近期点对
枚举每一个点显然会T
考虑每次将关键点划分为两个集合A,B。然后将A中的每一个点x的初始距离设为len(1,x),跑最短路,然后用B中的每一个点y的disy+len(y,1)统计答案,再将AB反转做一次
这样仅仅要随意点对都被分别划分到两个集合中至少一次,那么答案就被更新完了
怎样划分呢?我们考虑依照二进制拆分,对于每一位划分一次,将该位上为0的划分到A集合中。该位上为1的划分到B集合中
因为两个数至少有一位不同,因此随意点对至少被划分了一次
这样划分O(log2n)次就够了
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 5050
using namespace std;
struct abcd{
int to,f,next;
}table[M<<2];
int head[M],tot;
int n,m,top,ans=0x3f3f3f3f;
pair<int,pair<int,int> >stack[M<<1];
int f[M];
void Add(int x,int y,int z)
{
table[++tot].to=y;
table[tot].f=z;
table[tot].next=head[x];
head[x]=tot;
}
namespace Heap{
int heap[M],pos[M],top;
void Push_Up(int t)
{
while(t>1)
{
if( f[heap[t]]<f[heap[t>>1]] )
swap(heap[t],heap[t>>1]),swap(pos[heap[t]],pos[heap[t>>1]]),t>>=1;
else
break;
}
}
void Insert(int x)
{
heap[++top]=x;
pos[x]=top;
Push_Up(top);
}
void Pop()
{
pos[heap[1]]=0;
heap[1]=heap[top--];
if(top) pos[heap[1]]=1;
int t=2;
while(t<=top)
{
if( f[heap[t+1]]<f[heap[t]] )
++t;
if( f[heap[t]]<f[heap[t>>1]] )
swap(heap[t],heap[t>>1]),swap(pos[heap[t]],pos[heap[t>>1]]),t<<=1;
else
break;
}
}
}
void Dijkstra()
{
using namespace Heap;
int i;
for(i=1;i<=n;i++)
Insert(i);
while(Heap::top)
{
int x=heap[1];Pop();
for(i=head[x];i;i=table[i].next)
if(f[table[i].to]>f[x]+table[i].f)
{
f[table[i].to]=f[x]+table[i].f;
Push_Up(pos[table[i].to]);
}
}
}
int main()
{
int i,j,x,y,z1,z2;
cin>>n>>m;
for(i=1;i<=m;i++)
{
scanf("%d%d%d%d",&x,&y,&z1,&z2);
if(x>y) swap(x,y),swap(z1,z2);
if(x==1)
stack[++top]=make_pair(y,make_pair(z1,z2));
else
Add(x,y,z1),Add(y,x,z2);
}
for(j=1;j<=n;j<<=1)
{
memset(f,0x3f,sizeof f);
for(i=1;i<=top;i++)
if(i&j)
f[stack[i].first]=stack[i].second.first;
Dijkstra();
for(i=1;i<=top;i++)
if(~i&j)
ans=min(ans,f[stack[i].first]+stack[i].second.second);
memset(f,0x3f,sizeof f);
for(i=1;i<=top;i++)
if(~i&j)
f[stack[i].first]=stack[i].second.first;
Dijkstra();
for(i=1;i<=top;i++)
if(i&j)
ans=min(ans,f[stack[i].first]+stack[i].second.second);
}
cout<<ans<<endl;
return 0;
}
BZOJ 2069 POI2004 ZAW 堆优化Dijkstra的更多相关文章
- BZOJ.2069.[POI2004]ZAW(最短路Dijkstra 按位划分)
题目链接 \(Description\) 给定一张带权图(边是双向的,但不同方向长度不同).求从1出发,至少经过除1外的一个点,再回到1的最短路.点和边不能重复经过. \(n\leq5000,m\le ...
- BZOJ 2069: [POI2004]ZAW(Dijkstra + 二进制拆分)
题意 给定一个有 \(N\) 个点 \(M\) 条边的无向图, 每条无向边 最多只能经过一次 . 对于边 \((u, v)\) , 从 \(u\) 到 \(v\) 的代价为 \(a\) , 从 \(v ...
- 【刷题】BZOJ 2069 [POI2004]ZAW
Description 在Byte山的山脚下有一个洞穴入口. 这个洞穴由复杂的洞室经过隧道连接构成. 洞穴的入口是一条笔直通向"前面洞口"的道路. 隧道互相都不交叉(他们只在洞室相 ...
- BZOJ 3040 最短路 (堆优化dijkstra)
这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...
- 2069: [POI2004]ZAW
2069: [POI2004]ZAW 链接 题意: 给定一张带权图(边是双向的,但不同方向长度不同).求从1出发,至少经过除1外的一个点,再回到1的最短路.点和边不能重复经过. n≤5000,m≤10 ...
- UVA - 11374 - Airport Express(堆优化Dijkstra)
Problem UVA - 11374 - Airport Express Time Limit: 1000 mSec Problem Description In a small city c ...
- BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...
- 配对堆优化Dijkstra算法小记
关于配对堆的一些小姿势: 1.配对堆是一颗多叉树. 2.包含优先队列的所有功能,可用于优化Dijkstra算法. 3.属于可并堆,因此对于集合合并维护最值的问题很实用. 4.速度快于一般的堆结构(左偏 ...
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
随机推荐
- C和C++内存分配方式记录
C. C++中内存分配方式可以分为三种: (1)从静态存储区域分配:内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在.速度快.不容易出错,因为有系统会善后.例如全局变量,static变 ...
- Linux 之 用户及用户组
用户及用户组 参考教程:[千峰教育] 命令: whoami: 作用:查看当前登录的用户. 格式:whoami /etc/passwd: 说明:该文件存放了系统中所有的用户,每一行的每一列如下: 用户名 ...
- Python Challenge 第三关
进入第三关,还是一张图加一句话:One small letter, surrounded by EXACTLY three big bodyguards on each of its sides. 图 ...
- http错误种类及原因
http://blog.csdn.net/dxykevin/article/details/50950878 [摘要]HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应 ...
- 洛谷——P2527 [SHOI2001]Panda的烦恼
P2527 [SHOI2001]Panda的烦恼 题目描述 panda是个数学怪人,他非常喜欢研究跟别人相反的事情.最近他正在研究筛法,众所周知,对一个范围内的整数,经过筛法处理以后,剩下的全部都 ...
- 洛谷——P1078 文化之旅
P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能 ...
- [IOS笔记] - 动画animation
//移动 - (IBAction)translation:(id)sender { CABasicAnimation *traslation = [CABasicAnimation animation ...
- scrapy 启动失败,scrapy startproject test 出错 'module' object has no attribute 'OP_NO_TLSv1_1
你先看看 pip install scrapy需要的 pyopenssl twisted 等和你安装的版本一样么 我的就是因为TWist 版本高于 需要的 用pip install twist ...
- GDI+ ColorMatrix的完全揭秘
无论是用何种语言,只要使用过Windows的GDI+的人对ColorMatrix都不陌生,我的BLOG文章中也多次提到过,并在<GDI+ for VCL基础 -- 颜色调整矩阵ColorMatr ...
- PS 如何使用抽出滤镜抠人物的头发丝等细节
1.打开图片,复制背景,关闭背景眼睛.单击 滤镜 -抽出, 我们要学会观察图片,先来看下面这张图: 这张图片色彩虽然不算丰富,但也不是纯色背景,甚至有些许的零乱,但人物的主题却被黑色长发包围, 我们只 ...