题目大意:
  给定一个$n(n\leq40000)$个点$m(m\leq100000)$条边的有向图,求从$1$出发回到$1$的不经过重复结点的最短路。

思路:
  首先Dijkstra求出从1出发到每个结点$i$的单源最短路$dis[i]$及经过的第一个结点$first[i]$。
  考虑重构图,将起点与终点区分开来,新建结点$n+1$表示终点。
  枚举原图中的每一条边$(x,y,w)$,表示从$x$到$y$边权为$w$。
  若$x=1,first[y]\ne y$,在新图中保留这条边;
  若$y=1,first[x]\ne x$,说明存在一条从$1$沿最短路到$x$再到$1$的合法路径,在新图中连边$(1,n+1,w)$;
  若$y=1,first[x]=x$,在新图中保留这条边;
  若$x\ne1,y\ne1,first[x]\ne first[y]$,说明存在一条从$1$沿最短路到$x$再到$y$再沿最短路到$1$的合法路径,连边$(1,y,dis[x]+w)$;
  若$x\ne1,y\ne1,first[x]=first[y]$,在新图中保留这条边。
  最后再求一遍从$1$到$n+1$的最短路即可。

 #include<list>
#include<cstdio>
#include<cctype>
#include<climits>
#include<functional>
#include<ext/pb_ds/priority_queue.hpp>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=;
typedef std::pair<int,int> Edge;
typedef std::list<Edge> List;
typedef std::pair<int,int> Vertex;
typedef __gnu_pbds::priority_queue<Vertex,std::greater<Vertex> > Heap;
int n,dis[N],first[N];
List e[N];
inline void add_edge(const int &u,const int &v,const int &w) {
e[u].push_front((Edge){v,w});
}
void dijkstra() {
static Heap q;
static Heap::point_iterator p[N];
for(register int i=;i<=n;i++) {
p[i]=q.push((Vertex){dis[i]=i==?:INT_MAX,i});
}
while(!q.empty()) {
const int &x=q.top().second;
for(register List::iterator i=e[x].begin();i!=e[x].end();i++) {
const int &y=i->first,&w=i->second;
if(dis[x]+w<dis[y]) {
first[y]=x==?y:first[x];
q.modify(p[y],(Vertex){dis[y]=dis[x]+w,y});
}
}
q.pop();
}
}
void rebuild() {
n++;
for(register int x=;x<=n;x++) {
for(register List::iterator i=e[x].begin();i!=e[x].end();e[x].erase(i++)) {
const int &y=i->first,&w=i->second;
if(x==&&first[y]!=y) add_edge(,y,w);
if(y==) first[x]==x?add_edge(x,n,w):add_edge(,n,dis[x]+w);
if(x!=&&y!=) first[x]==first[y]?add_edge(x,y,w):add_edge(,y,dis[x]+w);
}
}
}
int main() {
n=getint();
for(register int m=getint();m;m--) {
const int u=getint(),v=getint();
add_edge(u,v,getint());
add_edge(v,u,getint());
}
dijkstra();
rebuild();
dijkstra();
printf("%d\n",dis[n]==INT_MAX?-:dis[n]);
return ;
}

[BZOJ4398]福慧双修/[BZOJ2407]探险的更多相关文章

  1. 【技巧 二进制分组】bzoj4398: 福慧双修&&2407: 探险

    二进制分组也可以说是一种比较优美的拆贡献方式吧? Description 菩萨为行,福慧双修,智人得果,不忘其本.——唐朠立<大慈恩寺三藏法师传>有才而知进退,福慧双修,这才难得.——乌雅 ...

  2. BZOJ_4398_福慧双修&&BZOJ_2407_探险_分治+dij

    BZOJ_4398_福慧双修&&BZOJ_2407_探险_分治+dij Description 菩萨为行,福慧双修,智人得果,不忘其本. ——唐朠立<大慈恩寺三藏法师传> ...

  3. bzoj4398: 福慧双修

    正边权无向图,一条边两个方向权值不一定相同,求经过点1的最小简单环 简单环包含了点1的一条出边和一条入边,且这两条边不同,因此可以枚举这两条边的编号的二进制表示中哪一位不同,用最短路求此时的最优解,时 ...

  4. [bzoj4398] 福慧双修 最短路 二进制分组

    ---题面--- 题解: 考场上看的这道题,,,当时70分算法打挂了,今天才知道这个也是原题.... 首先,对于不跟1相邻的边,肯定不会经过两次,因为经过两次就回来了,除了增加路径长度之外没有任何意义 ...

  5. 福慧双修&探险 BZOJ4398&BZOJ2407

    分析: 双倍经验(数据范围不同). 我们考虑,我们必定是从1走一条边到节点i,之后从i到j跑最短路,之后再从j到1走另一条边的情况下,不会重复,并且是答案.那么我们考虑预处理出pre[i]表示从1走到 ...

  6. 【BZOJ2407/4398】探险/福慧双修 最短路建模

    [BZOJ2407]探险 Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作 ...

  7. BZOJ2407/4398:探险/福慧双修(最短路)

    Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...

  8. 【BZOJ4398】福慧双修(二进制,最短路)

    题意: 此题中S=1 思路:Orz ManGod秒切此题 我觉得出入边权互换不太直观,就改了一下写法 第一次默认与1有关的第一条出边只出不入,第二次默认只入不出 ..]of longint; head ...

  9. bzoj4398:福慧双修

    学习了一下最短路的姿势,这个建图方法好妙啊,虽然不会证明正确性…… #include <bits/stdc++.h> #define N 220000 #define INF 100000 ...

随机推荐

  1. Linux认知之旅【06 图形界面上的各种折腾】!

    玩linux免不了折腾,不折腾对不起linux 初次接触, 总会接触到绚丽的linux桌面! 但是随之而来的桌面优化,字体安装,操作习惯都需要一一适应

  2. Python学习-前台开发-JavaScript、Dom和jQuery

    JavaScript JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. ...

  3. 孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备

     孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天本来应当继续学习Python的数据库操作,但根据过去我自 ...

  4. VS配置使用第三方库

    VS使用第三方库 项目设置 调整头文件引用目录 C/C++ -> General -> Additional Include Directories 添加库文件目录 Linker -> ...

  5. Linux 文本对比 diff 命令详解(整理)

    diff 命令详解 1.概述 windows系统下面就有不错的文本对比工具可以使用,例如常用的Beyond Compare,WinMerge都是图形界面的比较工具而且使用非常方便,如果你仅仅是在win ...

  6. JavaWeb笔记(五)JSP

    JSP 指令 格式: <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %> 分类: page 配置JSP页面 contentType:等同于response.setCon ...

  7. OpenFlow-Enaling innvation in Campus Networks

    OpenFlow-Enaling innvation in Campus Networks 出现问题 背景 Networks have become part of the critical infr ...

  8. web服务器集群session同步

    在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是 ...

  9. urllib2.URLError: <ulropn error [Errno 10060] >

    在抓网页的时候,如果抓取频率很高,很容易出现这个错误: 意思是服务器拒绝响应.解决的方法为,隔段时间再试,不过这个方法不靠谱.靠谱的方法是增加一个延迟函数 import time time.sleep ...

  10. JAVA下几个问题

    一.Server MyEclipse Tomcat v8.5 was unable to start within 45 seconds. If the server requires more ti ...