传送门

图论模拟题。

这题直接写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(最短路)的更多相关文章

  1. 2018.07.22 洛谷P3047附近的牛(树形dp)

    传送门 给出一棵n" role="presentation" style="position: relative;">nn个点的树,每个点上有C ...

  2. 2018.07.22 洛谷P2986 伟大的奶牛聚集(树形dp)

    传送门 给出一棵树,树有边权和点权,若选定一个点作为中心,这棵树的代价是所有点权乘上到根的距离的和.求代价最小. 解法:一道明显的换根dp" role="presentation& ...

  3. 2018.07.22 洛谷P4316 绿豆蛙的归宿(概率dp)

    传送门 简单的递推. 由于是DAG" role="presentation" style="position: relative;">DAGDA ...

  4. 2018.07.22 洛谷P1967 货车运输(kruskal重构树)

    传送门 这道题以前只会树剖和最小生成树+倍增. 而现在学习了一个叫做kruskal" role="presentation" style="position: ...

  5. BZOJ 3538 == 洛谷 P3106 [USACO14OPEN]GPS的决斗Dueling GPS's

    P3106 [USACO14OPEN]GPS的决斗Dueling GPS's 题目描述 Farmer John has recently purchased a new car online, but ...

  6. Luogu P3106 [USACO14OPEN]GPS的决斗Dueling GPS's(最短路)

    P3106 [USACO14OPEN]GPS的决斗Dueling GPS's 题意 题目描述 Farmer John has recently purchased a new car online, ...

  7. 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 ...

  8. 2018.07.17 洛谷P1368 工艺(最小表示法)

    传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...

  9. 2018.07.01 洛谷小B的询问(莫队)

    P2709 小B的询问 题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数 ...

随机推荐

  1. git 提交文件到gitee

    1.新建文件夹   打开gitbash  初始化仓库 git.init 2.把要提交的文件copy到文件夹 3.git add. 4.git remote add master(分支)  远程仓库 5 ...

  2. Activity服务类-7 RepositoryService服务类

    Activity服务类-1 RepositoryService服务类一共47个接口1.创建部署//开始创建一个新的部署.DeploymentBuilder createDeployment(); 2. ...

  3. windows installer 应用变换时的错误.请验证指定的变换路径是否有

    安装Windows Installer Clean Up 清理一下残留的项目之后再装或者手动去注册表找 HKEY_CLASSES_ROOT\Installer\Products\ 下面的"子 ...

  4. 脚本中 %~dp0

    cmd窗口中 for /? 查询参数含义 %~dp0, 将参数转换为磁盘路径+名字 例: 脚本中一行 %~dp0abc.exe (abc.exe位置c:\test\abc.exe) 展开后则为 c:\ ...

  5. 从底层谈WebGIS 原理设计与实现(一):开篇

    从底层谈WebGIS 原理设计与实现(一):开篇 作者:naaoveGI…    文章来源:http://www.cnblogs.com/naaoveGIS/    点击数:4773    更新时间: ...

  6. Json字符串转Dictionary

    /// <summary> /// json字符串转Dictionary /// </summary> /// <param name="json"& ...

  7. ubuntu 安装qq方案

    from: http://blog.csdn.net/fuchaosz/article/details/51919607 安装wineQQ国际版 VirtualBox安装windows,再安装QQ,然 ...

  8. 根据class操作div显示与隐藏

    <div class="otherComment" > <!-- style="display:none" --> 测试 </di ...

  9. JDBC之使用配置文件链接数据库

    写在前面 JDBC以一种统一的方式来对各种各样的数据库进行存取,JDBC为开发人员隐藏了不同数据库的不同特性.程序员开发时,知道要开发访问数据库的应用,于是将一个对应数据库的JDBC驱动程序类的引用进 ...

  10. pyplot文本显示

    pyplot文本显示 pyplot中文字符显示 pyplot默认不支持中文字符,因为默认字体是sans-serif,英文字体不能显示中文 方法1,修改需要输出中文字符的地方 在有中文输出的地方,添加属 ...