【BZOJ2407/4398】探险/福慧双修 最短路建模
【BZOJ2407】探险
Description
Input
第一行两个数n,m表示溶洞的数量以及暗道的数量。
Output
Sample Input
1 2 2 1
2 3 4 5
3 1 3 2
Sample Output
HINT
N<=10000,M<=200000,1<=W,V<=10000
题解:如果想不经过重复的边回到1号点,那么只需要满足从1出发时走的点不同于回到1时走的点即可。那么我们先跑一边spfa,在求最短路的同时维护一个pre数组,代表如果沿最短路走到i,则从i出发时走的第一个点是pre[i]。那么我们所求的路径一定是从一些pre=x的点走到一些pre!=x的点再走到1号点。那么我们可以采用如下方法构造新图。
新建汇点n+1,对于边(u,v,len),如果pre[u]!=pre[v],则直接连从1到v,边权为dis[u]+len的边;否则连从u到v,边权len的边。
特别地,如果u=1,那么若pre[v]!=v,连从1到v边权dis[v]的边;否则不连。
如果v=1,那么若pre[u]!=u,直接用dis[u]+len更新答案;否则连u到n+1,边权len的边。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <utility>
#define mp(A,B) make_pair(A,B)
using namespace std;
const int maxn=10010;
const int maxm=400010;
int n,m,cnt,ans;
queue<int> q;
int pre[maxn],inq[maxn],dis[maxn],pa[maxm],pb[maxm],pc[maxm];
int to[maxm],next[maxm],val[maxm],head[maxn];
void add(int a,int b,int c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
}
void spfa()
{
int u,i;
while(!q.empty())
{
u=q.front(),q.pop(),inq[u]=0;
for(i=head[u];i!=-1;i=next[i]) if(dis[to[i]]>dis[u]+val[i])
{
dis[to[i]]=dis[u]+val[i],pre[to[i]]=pre[u];
if(!inq[to[i]]) inq[to[i]]=1,q.push(to[i]);
}
}
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd();
int i,a,b,c,d;
memset(head,-1,sizeof(head));
for(i=1;i<=m;i++)
a=rd(),b=rd(),c=rd(),d=rd(),add(a,b,c),pa[cnt]=a,pb[cnt]=b,pc[cnt]=c,add(b,a,d),pa[cnt]=b,pb[cnt]=a,pc[cnt]=d;
memset(dis,0x3f,sizeof(dis));
dis[1]=0;
for(i=head[1];i!=-1;i=next[i]) dis[to[i]]=val[i],q.push(to[i]),inq[to[i]]=1,pre[to[i]]=to[i];
spfa();
memset(head,-1,sizeof(head)),cnt=0;
ans=1<<30;
for(i=1;i<=2*m;i++)
{
if(pa[i]==1)
{
if(pre[pb[i]]!=pb[i]) add(1,pb[i],pc[i]);
}
else if(pb[i]==1)
{
if(pre[pa[i]]==pa[i]) add(pa[i],n+1,pc[i]);
else ans=min(ans,dis[pa[i]]+pc[i]);
}
else
{
if(pre[pa[i]]==pre[pb[i]]) add(pa[i],pb[i],pc[i]);
else add(1,pb[i],dis[pa[i]]+pc[i]);
}
}
memset(dis,0x3f,sizeof(dis));
dis[1]=0,q.push(1);
spfa(),ans=min(ans,dis[n+1]);
if(ans==1<<30||ans==0x3f3f3f3f) printf("-1");
else printf("%d",ans);
return 0;
}
【BZOJ2407/4398】探险/福慧双修 最短路建模的更多相关文章
- BZOJ2407/4398:探险/福慧双修(最短路)
Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...
- POJ 1062 昂贵的聘礼 【带限制的最短路/建模】
年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:" ...
- [USACO14OPEN] Dueling GPS's[最短路建模]
题目描述 Farmer John has recently purchased a new car online, but in his haste he accidentally clicked t ...
- bzoj 2118 墨墨的等式 - 图论最短路建模
墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. Input ...
- Vijos1404遭遇战[最短路建模]
背景 你知道吗,SQ Class的人都很喜欢打CS.(不知道CS是什么的人不用参加这次比赛). 描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分子要炸掉藏在A区的SQC论坛服务器!我们SQC ...
- POJ1062昂贵的聘礼[最短路建模]
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45892 Accepted: 13614 Descripti ...
- BZOJ2118墨墨的等式[数论 最短路建模]
2118: 墨墨的等式 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1317 Solved: 504[Submit][Status][Discus ...
- BZOJ4289 Tax 最短路建模
给定一个带边权的无向图,求1到n的最小代价路径.经过一个点的代价是路径上这个点的入边和出边的较大权值. \(n \le 100000, m \le 200000\). 一般的建图是考虑每个点,其入边和 ...
- hdu 6071 Lazy Running 最短路建模
Lazy Running Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) P ...
随机推荐
- Cocos2dx 粒子销毁问题
Cocos2dx 粒子销毁问题 DionysosLai(906391500@qq.com) 2014-7-3 之前在调试粒子特效时,在粒子编辑器有个选项是用来调整粒子的生命时间,当粒子存在的时间 ...
- QQ-weiyun(微云)-云储存
ylbtech-DatabaseDesgin:QQ-weiyun(微云)-云储存 1.A,数据库关系图(Database Diagram) -- =========================== ...
- osgconv使用指南(转)
osgconv是一种用来读取3D数据库以及对它们实施一些简单的操作的实用应用程序,同时也被称作 一种专用3D数据库工具. 用osgconv把其他格式的文件转换为OSG所支持的格式 osgconv是一种 ...
- Python中的*args和**kwargs的理解与用法
一.简述 1.*args和**kwargs 这两个是python中方法的可变参数. 2.*args表示任何多个无名参数,它是一个tuple: 3.**kwargs表示关键字参数,它是一个dict.并且 ...
- [Java] 实验8
[Java] 实验7參考代码,代码已更新.感兴趣的同学能够去学习. 1. default package问题可參考实验6 2. for, if, while等.后面包括多条语句时,须要用花括号括起来 ...
- 【共享单车】—— React后台管理系统开发手记:权限设置和菜单调整(未完)
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
- Excel 数据导入SQL XML 自动生成表头
去出差的时候应客户要求要要将Excel 文件内的数据批量导入到数据库中,而且有各种不同种类的表格,如果每一个表格多对应一个数据表的话, 按照正常的方法应该是创建数据表,创建数据库中映射的数据模型,然后 ...
- http header 具体解释
HTTP(HyperTextTransferProtocol)即超文本传输协议,眼下网页传输的的通用协议. HTTP协议採用了请求/响应模型,浏览器或其它client发出请求,server给与响应. ...
- bat 处理文件路径 (所在目录,文件名,文件后缀名,完整文件名,无后缀路径)
echo off setlocal enabledelayedexpansion set "EXCEL_DIR=%cd%\excel" for /R %EXCEL_DIR% %%f ...
- 已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”
题目:已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”. 代码: <!DOCTYPE html> &l ...