题目: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=,M=1e4+,lm=;
int n,m,hd[N],xnt=,to[M<<],nxt[M<<],w[M<<];
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==)fr[++cnt]=xnt-;if(y==)fr[++cnt]=xnt;
}
void dj()
{
memset(dis,0x3f,sizeof dis);
memset(vis,,sizeof vis);vis[]=;
for(int i=;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]=;
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=,x,y,z0,z1;i<=m;i++)
{
scanf("%d%d%d%d",&x,&y,&z0,&z1);
add(x,y,z0,z1);
}
for(int i=;i<=lm;i++)
{
int bin=(<<i);
for(int j=;j<=cnt;j++)
if(to[fr[j]]&bin) st[j]=; else st[j]=;
dj();
for(int j=;j<=cnt;j++)
{
if(!st[j]) ans=min(ans,dis[to[fr[j]]]+w[fr[j]^]);
st[j]=!st[j];
}
dj();
for(int j=;j<=cnt;j++) if(!st[j])
ans=min(ans,dis[to[fr[j]]]+w[fr[j]^]);
}
printf("%d\n",ans);
return ;
}

bzoj 2096 [POI2004]ZAW——二进制枚举的更多相关文章

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

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

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

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

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

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

  4. BZOJ 2069 POI2004 ZAW 堆优化Dijkstra

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

  5. 2069: [POI2004]ZAW

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

  6. UVA 1151二进制枚举子集 + 最小生成树

    题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此, 你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐(数 ...

  7. Good Bye 2015B(模拟或者二进制枚举)

    B. New Year and Old Property time limit per test 2 seconds memory limit per test 256 megabytes input ...

  8. Poj(2784),二进制枚举最小生成树

    题目链接:http://poj.org/problem?id=2784 Buy or Build Time Limit: 2000MS   Memory Limit: 65536K Total Sub ...

  9. POJ 2436 二进制枚举+位运算

    题意:给出n头牛的得病的种类情况,一共有m种病,要求找出最多有K种病的牛的数目: 思路:二进制枚举(得病处为1,否则为0,比如得了2 1两种病,代号就是011(十进制就是3)),首先枚举出1的个数等于 ...

随机推荐

  1. [转]linux terminal中使用proxy

    转自:http://www.cnblogs.com/JoJosBizarreAdventure/p/5892383.html 在linux terminal中使用代理 方法一: terminal中输入 ...

  2. iOS OC和JS的交互 javaScriptCore方法封装

    一.javaScriptCore javaScriptCore是一种JavaScript引擎,主要为webKit提供脚本处理能力,javaScriptCore是开源webkit的一部分,他提供了强大的 ...

  3. Python整型int、浮点float常用方法

    #!/usr/bin/env python # -*- coding:utf-8 -*- # Python整型int.浮点float # abs(x) # 返回数字的绝对值,如abs(-10) 返回 ...

  4. js面对对象编程

    说到js,非常大一部分人会说我非常熟悉,在日常的web开发中经经常使用,那么你的js代码是符合面对对象思路的吗?那你会问我面向过程的js代码有什么不好吗?我的感受是面对对象的js编码更加简洁,降低了混 ...

  5. 安装Nginx 及使用

    1.下载 Nginx wget http://nginx.org/download/nginx-1.10.3.tar.gz   (稳定版) 2.提前下载好依赖包 openssl.zlib.pcre p ...

  6. CentOS 7.0 systemd

    CentOS 7 已经切换到 systemd,系统指令也有所变化.之前用于启动.重启.停止各种服务的service 作为向后兼容的指令还能使用,但是将来可能会消失.同时,chkconfig 也改成了s ...

  7. cmd - - - 随笔

    dxdiag DirectX诊断工具 calc 计算机 cmd里面不想一点点输入冗长的文件路径?直接把这个文件拖到CMD窗口吧!你会发现 路径自己补上去了.有空格的还会自动加引号哟.

  8. Javamail 发送附件中文名过长以及乱码问题

      最近在弄javamail发送邮件当邮件里含有附件并且附件是中文的时候发送后就会出现乱码!! 通过javax.mail.internet.MimeUtility.encodeText()就可解决这个 ...

  9. 两个小例子彻底明白python decorator

    一:没有什么实际意思,就是单纯的理解decorator.使用装饰器完全可以阻止方法中的代码执行. class json_test(object): def __init__(self, *arg, * ...

  10. [原创]Scala学习:函数的定义

    方式一:标准的定义函数 def 函数名(参数1: 参数类型,参数2: 参数类型): 返回值类型 = { 函数体 } 例子 def max(x: Int,y: Int): Int ={ if(x > ...