zoukankan      html  css  js  c++  java
  • 【洛谷P3106】[USACO14OPEN]GPS的决斗Dueling GPS's

    题目描述

    给你一个N个点的有向图,可能有重边.

    有两个GPS定位系统,分别认为经过边i的时间为Pi,和Qi.

    每走一条边的时候,如果一个系统认为走的这条边不是它认为的最短路,就会受到警告一次T T

    两个系统是分开警告的,就是说当走的这条边都不在两个系统认为的最短路范围内,就会受到2次警告.

    如果边(u,v)不在u到n的最短路径上,这条边就受到一次警告,求从1到n最少受到多少次警告。

    输入输出格式

    输入格式:

    • Line 1: The integers N and M.

    Line i describes road i with four integers: A_i B_i P_i Q_i.

    输出格式:

    • Line 1: The minimum total number of complaints FJ can receive if he routes himself from his house to the farm optimally.

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    using namespace std;
    const int maxn=50000+5;
    inline void read(int &x){
        x=0; char ch=getchar();
        while(ch<'0'||ch>'9') ch=getchar();
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    }
    int n,m,tot,u[maxn],v[maxn],p[maxn],q[maxn];
    int head[maxn],dis[4][maxn];
    bool inq[maxn];
    queue<int>Q;
    struct node{
        int next,to,c[4];
    }e[maxn<<1];
    inline void ins(int from,int to,int c1,int c2,int c3){
        e[++tot].next=head[from];
        e[tot].to=to; e[tot].c[1]=c1; e[tot].c[2]=c2; e[tot].c[3]=c3;
        head[from]=tot;
    }
    void spfa(int x,int k){
        Q.push(x); dis[k][x]=0; inq[x]=1;
        do{
            int u=Q.front(); Q.pop(); inq[u]=0;
            for(int i=head[u];i;i=e[i].next)
            if(dis[k][e[i].to]>dis[k][u]+e[i].c[k]){
                dis[k][e[i].to]=dis[k][u]+e[i].c[k];
                if(!inq[e[i].to]) Q.push(e[i].to),inq[e[i].to]=1;
            }
        }while(!Q.empty());
    }
    int main(){
        read(n);read(m);
        for(int i=1;i<=m;++i){
            read(u[i]);read(v[i]);read(p[i]);read(q[i]);
            ins(v[i],u[i],p[i],q[i],0);
        }
        memset(dis,0x3f,sizeof(dis));
        spfa(n,1); spfa(n,2);
        tot=0; memset(head,0,sizeof(head));
        for(int i=1;i<=m;++i){
            int w=2;
            if(dis[1][u[i]]-dis[1][v[i]]==p[i]) --w;
            if(dis[2][u[i]]-dis[2][v[i]]==q[i]) --w;
            ins(u[i],v[i],0,0,w);
        }
        spfa(1,3);
        printf("%d
    ",dis[3][n]);
        return 0;
    }
  • 相关阅读:
    uva 1637 Double Patience
    Emacs ^ Vim
    uva 11181 Probability|Given
    uva 10491 Cows and Cars
    uva 1636 Headshot
    hdu 4336 Card Collector
    zoj 3640 Help Me Escape
    Codeforces 148 D Bag of mice
    hdu 4405 Aeroplane chess
    hdu 3853 LOOPS
  • 原文地址:https://www.cnblogs.com/huihao/p/7757991.html
Copyright © 2011-2022 走看看