2018.07.22 洛谷P3106 GPS的决斗Dueling GPS's(最短路)
传送门
图论模拟题。
这题直接写3个(可以压成一个)spfa" role="presentation" style="position: relative;">spfaspfa,前两个把题上的p,q" role="presentation" style="position: relative;">p,qp,q分别当做边权来跑,然后最后一次将前两次标记过两次的边边权设为0,标记过一次的边权设为1,没标记过的边权设为0就行了。
代码如下:
#include<bits/stdc++.h>
#define N 100005
#define M 500005
using namespace std;
struct Node{int v,next,w;}e1[M<<1],e2[M<<1],e[M<<1];
int first1[N],first2[N],first[N],d1[N],d2[N],p1[N],p2[N],d[N],n,m,cnt=0,cnt1=0,cnt2=0;
bool in1[N],in2[N],in[N];
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
inline void add1(int u,int v,int w){
e1[++cnt1].v=v;
e1[cnt1].w=w;
e1[cnt1].next=first1[u];
first1[u]=cnt1;
}
inline void add2(int u,int v,int w){
e2[++cnt2].v=v;
e2[cnt2].w=w;
e2[cnt2].next=first2[u];
first2[u]=cnt2;
}
inline void add(int u,int v,int w){
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].next=first[u];
first[u]=cnt;
}
inline void spfa1(int s=n){
queue<int>q;
memset(d1,0x3f3f3f3f,sizeof(d1));
memset(in1,false,sizeof(in1));
d1[s]=0,q.push(s);
while(!q.empty()){
int x=q.front();
q.pop();
in1[x]=false;
for(int i=first1[x];i;i=e1[i].next){
int v=e1[i].v;
if(d1[v]>d1[x]+e1[i].w){
d1[v]=d1[x]+e1[i].w;
p1[v]=i;
if(!in1[v])in1[v]=true,q.push(v);
}
}
}
}
inline void spfa2(int s=n){
queue<int>q;
memset(d2,0x3f3f3f3f,sizeof(d2));
memset(in2,false,sizeof(in2));
d2[s]=0,q.push(s);
while(!q.empty()){
int x=q.front();
q.pop();
in2[x]=false;
for(int i=first2[x];i;i=e2[i].next){
int v=e2[i].v;
if(d2[v]>d2[x]+e2[i].w){
d2[v]=d2[x]+e2[i].w;
p2[v]=i;
if(!in2[v])in2[v]=true,q.push(v);
}
}
}
}
inline void spfa(int s=1){
queue<int>q;
memset(d,0x3f3f3f3f,sizeof(d));
memset(in,false,sizeof(in));
d[s]=0,q.push(s);
while(!q.empty()){
int x=q.front();
q.pop();
in[x]=false;
for(int i=first[x];i;i=e[i].next){
int v=e[i].v,w=e[i].w;
if(p1[x]==i)--w;
if(p2[x]==i)--w;
if(d[v]>d[x]+w){
d[v]=d[x]+w;
if(!in[v])in[v]=true,q.push(v);
}
}
}
}
int main(){
n=read(),m=read();
for(int i=1;i<=m;++i){
int u=read(),v=read(),p=read(),q=read();
add1(v,u,p),add2(v,u,q),add(u,v,2);
}
spfa1(),spfa2(),spfa();
printf("%d",d[n]);
return 0;
}
2018.07.22 洛谷P3106 GPS的决斗Dueling GPS's(最短路)的更多相关文章
- 2018.07.22 洛谷P3047附近的牛(树形dp)
传送门 给出一棵n" role="presentation" style="position: relative;">nn个点的树,每个点上有C ...
- 2018.07.22 洛谷P2986 伟大的奶牛聚集(树形dp)
传送门 给出一棵树,树有边权和点权,若选定一个点作为中心,这棵树的代价是所有点权乘上到根的距离的和.求代价最小. 解法:一道明显的换根dp" role="presentation& ...
- 2018.07.22 洛谷P4316 绿豆蛙的归宿(概率dp)
传送门 简单的递推. 由于是DAG" role="presentation" style="position: relative;">DAGDA ...
- 2018.07.22 洛谷P1967 货车运输(kruskal重构树)
传送门 这道题以前只会树剖和最小生成树+倍增. 而现在学习了一个叫做kruskal" role="presentation" style="position: ...
- BZOJ 3538 == 洛谷 P3106 [USACO14OPEN]GPS的决斗Dueling GPS's
P3106 [USACO14OPEN]GPS的决斗Dueling GPS's 题目描述 Farmer John has recently purchased a new car online, but ...
- Luogu P3106 [USACO14OPEN]GPS的决斗Dueling GPS's(最短路)
P3106 [USACO14OPEN]GPS的决斗Dueling GPS's 题意 题目描述 Farmer John has recently purchased a new car online, ...
- 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)
P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...
- 2018.07.17 洛谷P1368 工艺(最小表示法)
传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...
- 2018.07.01 洛谷小B的询问(莫队)
P2709 小B的询问 题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数 ...
随机推荐
- 敏捷:什么是用户故事(User Story)
摘要: 一件用户通过系统完成他一个有价值的目标(买一罐饮料)的事.这样的过程就叫"用户案例(user case)"或者"用户故事(user story)".本文 ...
- 非常简单的 xml转成数组的方法
function xml2arr($xml){ $obj = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); $jso ...
- 一个取消事件的简单js例子(事件冒泡与取消默认行为)
先上代码: <div id='outer' onclick='alert("我是outer")'> <div id="middle" oncl ...
- Unity 所有特殊文件夹
1.Editor 2.Editor Default Resources Editor Default Resources注意中间是有空格的,它必须放在Project视图的根目录下,如果你想放在/xxx ...
- 数据预处理之独热编码(One-Hot Encoding)(转载)
问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的三个特征: ["male", "female"] ["from ...
- 注释和取消注释 程序中的log日志
有点简单,但也是原创哦..亲测有效,期待指正. 更改了log多行的问题.. 例如//Log Util: 一.注释log import java.io.BufferedReader;import ...
- t检验,T Test (Student’s T-Test)
1.什么是T test? t-test:比较数据的均值,告诉你这两者之间是否相同,并给出这种不同的显著性(即是否是因为偶然导致的不同) The t test (also called Student’ ...
- P3157 [CQOI2011]动态逆序对
P3157 [CQOI2011]动态逆序对 https://www.luogu.org/problemnew/show/P3157 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai&g ...
- mysql基本的增删改查和条件语句
增 insert into 表名(列名,列名......) values("test1",23),("test2",23),("test3" ...
- ImageView小技巧
ImageView截取图片的方式 centerCrop:以中心点为基准 将图片的最短边与ImageView宽度匹配 其他部分裁掉centerInside: 以中心点为基准 将图片最长边 缩进控件去