分析:

双倍经验(数据范围不同)。

我们考虑,我们必定是从1走一条边到节点i,之后从i到j跑最短路,之后再从j到1走另一条边的情况下,不会重复,并且是答案。那么我们考虑预处理出pre[i]表示从1走到i满足最短路的并且经过pre[i],pre[i]为路径第二个节点。那么,针对每一个边,(x,y,z,v)满足当x!=1&&y!=1时,如果pre[x]!=pre[y]连接1,x,dis[y]+z和1,y,dis[x]+v(因为答案如果经过这个边,那么答案一定是dis[x]+dis[y]+z或者dis[x]+dis[y]+v中的一个),如果pre[x]==pre[y],那么保留这两条边。需要特判x==1||y==1的情况,具体看代码。

附上代码:

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
#define N 10010
struct node
{
int to,next,val;
}e[600010];
int dis[N],pre[N],vis[N],head[N],cnt,n,m;
void add(int x,int y,int z)
{
e[cnt].to=y;
e[cnt].next=head[x];
e[cnt].val=z;
head[x]=cnt++;
}
void spfa()
{
queue <int>q;q.push(1);dis[1]=0;
while(!q.empty())
{
int x=q.front();q.pop();vis[x]=0;
for(int i=head[x];i!=-1;i=e[i].next)
{
int to1=e[i].to;
if(dis[to1]>dis[x]+e[i].val)
{
dis[to1]=dis[x]+e[i].val;
pre[to1]=pre[x];
if(x==1)pre[to1]=to1;
if(!vis[to1])q.push(to1),vis[to1]=1;
}
}
}
//printf("%d %d %d\n",dis[1],dis[2],dis[3]);
}
struct no
{
int x,y,z,v;
}a[400010];
int main()
{
//freopen("both.in","r",stdin);freopen("both.out","w",stdout);
memset(head,-1,sizeof(head));cnt=0;memset(dis,0x3f,sizeof(dis));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].z,&a[i].v);
add(a[i].x,a[i].y,a[i].z);add(a[i].y,a[i].x,a[i].v);
}
spfa();
memset(head,-1,sizeof(head));cnt=0;
for(int i=1;i<=m;i++)
{
int x=a[i].x,y=a[i].y,z=a[i].z,v=a[i].v;
if(x==1)
{
if(pre[y]!=y)add(1,y,z),dis[n+1]=min(dis[n+1],dis[y]+v);
else add(y,n+1,v);
continue;
}
if(y==1)
{
if(pre[x]!=x)add(1,x,v),dis[n+1]=min(dis[n+1],dis[x]+z);
else add(x,n+1,z);
continue;
}
if(pre[x]!=pre[y])add(1,y,dis[x]+z),add(1,x,dis[y]+v);
else add(x,y,z),add(y,x,v);
}
for(int i=1;i<=n;i++)dis[i]=1<<30;
spfa();
printf("%d\n",dis[n+1]);
return 0;
}

  

福慧双修&探险 BZOJ4398&BZOJ2407的更多相关文章

  1. [BZOJ4398]福慧双修/[BZOJ2407]探险

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

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

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

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

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

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

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

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

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

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

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

  7. bzoj4398:福慧双修

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

  8. bzoj4398: 福慧双修

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

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

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

随机推荐

  1. BFC(块状格式化上下文)

    今天先来说关于BFC的一些基础知识 BFC是块状格式化上下文,它是一个独立的渲染区域,规定了内部如何布局,并且这个布局和外部毫不相干 触发BFC的方法 1.根元素(即html) 2.float属性不为 ...

  2. HTTP 协议入门-笔记

    原文参考http://mp.weixin.qq.com/s/czx0AHaItrJ-c49XDboIUg  HTTP是基于TCP/IP协议的应用层协议,规定了客户端和服务端之间的通信格式,默认使用80 ...

  3. 简单CNN 测试例

    1.训练数据: import tensorflow as tf import cv2 import os import numpy as np import time import matplotli ...

  4. json_encode无返回结果

    今天写php curl模拟客户端访问测试一个抽奖post数据,拿回来的数据是json,使用json_decode函数就是没结果,百度谷歌好久.终于发现是BOM的文件头造成的, 微软为utf-8文件添加 ...

  5. 《Javascript权威指南-第6版》

    第3章 类型.值和变量 3.2 文本 3.2.1 字符串直接量 建议:在javascript中使用单引号表示字符串,在HTML中使用双引号表示字符串; 3.2.2 转义字符 \n 换行符 \r 回车符 ...

  6. android:screenOrientation属性

    今天工作中发现一个activity的android:screenOrientation属性设置为behind,平时经常看到的是landscape.portrait,一时没有反应过来,故查了一下andr ...

  7. The current identity ( XXXX) does not have write access to ‘C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files’.解决办法

    环境windows 2008+IIS 7 找到 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET FilesTempora ...

  8. Linux 下解压 rar 文件

    网上下载rar 压缩文件的使用,在linux在我们需要对其进行解压缩,这个时候,我们需要安装 rar相关的文件,来进行解压缩. 1. 下载 我们进入rarlab网站,进行下载 rar for linu ...

  9. MySQL压缩包zip安装

    看了网上好多种教程,自己尝试失败了好多次,最后总算弄好了,具体如下 zip下载地址:https://dev.mysql.com/downloads/mysql/ 之后点击No thanks, just ...

  10. C#程序如何捕捉未try/catch的异常——不弹“XXX已停止工作”报错框

    诚意满满直接上代码: static void Main(string[] args) { //Main函数中增加此句 AppDomain.CurrentDomain.UnhandledExceptio ...