zoukankan      html  css  js  c++  java
  • BZOJ3538: [Usaco2014 Open]Dueling GPS

    3538: [Usaco2014 Open]Dueling GPS

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 59  Solved: 36
    [Submit][Status]

    Description

    Farmer John has recently purchased a new car online, but in his haste he accidentally clicked the "Submit" button twice when selecting extra features for the car, and as a result the car ended up equipped with two GPS navigation systems! Even worse, the two systems often make conflicting decisions about the route that FJ should take. The map of the region in which FJ lives consists of N intersections (2 <= N <= 10,000) and M directional roads (1 <= M <= 50,000). Road i connects intersections A_i (1 <= A_i <= N) and B_i (1 <= B_i <= N). Multiple roads could connect the same pair of intersections, and a bi-directional road (one permitting two-way travel) is represented by two separate directional roads in opposite orientations. FJ's house is located at intersection 1, and his farm is located at intersection N. It is possible to reach the farm from his house by traveling along a series of directional roads. Both GPS units are using the same underlying map as described above; however, they have different notions for the travel time along each road. Road i takes P_i units of time to traverse according to the first GPS unit, and Q_i units of time to traverse according to the second unit (each travel time is an integer in the range 1..100,000). FJ wants to travel from his house to the farm. However, each GPS unit complains loudly any time FJ follows a road (say, from intersection X to intersection Y) that the GPS unit believes not to be part of a shortest route from X to the farm (it is even possible that both GPS units can complain, if FJ takes a road that neither unit likes). Please help FJ determine the minimum possible number of total complaints he can receive if he chooses his route appropriately. If both GPS units complain when FJ follows a road, this counts as +2 towards the total.

    给你一个N个点的有向图,可能有重边.
    有两个GPS定位系统,分别认为经过边i的时间为Pi,和Qi.
    每走一条边的时候,如果一个系统认为走的这条边不是它认为的最短路,就会受到警告一次T T
    两个系统是分开警告的,就是说当走的这条边都不在两个系统认为的最短路范围内,就会受到2次警告.
    求一种方案,1àn,最少需要受到多少次警告.

    Input

    * Line 1: The integers N and M. Line i describes road i with four integers: A_i B_i P_i Q_i. 

    Output

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

    Sample Input

    5 7
    3 4 7 1
    1 3 2 20
    1 4 17 18
    4 5 25 3
    1 2 10 1
    3 5 4 14
    2 4 6 5

    INPUT DETAILS: There are 5 intersections and 7 directional roads. The first road connects from intersection 3 to intersection 4; the first GPS thinks this road takes 7 units of time to traverse, and the second GPS thinks it takes 1 unit of time, etc.

    Sample Output

    1
    OUTPUT DETAILS: If FJ follows the path 1 -> 2 -> 4 -> 5, then the first GPS complains on the 1 -> 2 road (it would prefer the 1 -> 3 road instead). However, for the rest of the route 2 -> 4 -> 5, both GPSs are happy, since this is a shortest route from 2 to 5 according to each GPS.

    HINT

     

    Source

    Silver By liyizhen2

     题解:

    麻烦的sb题。。。来回搞几次spfa就行了

    代码:

      1 #include<algorithm>  
      2 #include<iostream>  
      3 #include<cstring>  
      4 #include<cstdio>  
      5 #define inf 0x7fffffff  
      6 #define MAXN 100001
      7 using namespace std;
      8  
      9 inline int read() {
     10     int x = 0, f = 1;
     11     char ch = getchar();
     12     while (ch < '0' || ch > '9') {
     13         if (ch == '-')f = -1;
     14         ch = getchar();
     15     }
     16     while (ch >= '0' && ch <= '9') {
     17         x = x * 10 + ch - '0';
     18         ch = getchar();
     19     }
     20     return x*f;
     21 }
     22  
     23 struct edge {
     24     int to, next, v1, v2;
     25 } e[MAXN], d[MAXN];
     26 int n, m, cnt, ans, u[MAXN], v[MAXN], w1[MAXN], w2[MAXN], d1[10001], d2[10001], dis[10001], head[10001], h[10001];
     27  
     28 void ins(int u, int v, int w1, int w2) {
     29     e[++cnt] = (edge){v, head[u], w1, w2};
     30     head[u] = cnt;
     31 }
     32  
     33 void spfa1() {
     34     int q[MAXN], t = 0, w = 0;
     35     bool inq[10001];
     36     memset(inq, 0, sizeof (inq));
     37     memset(d1, 127, sizeof (d1));
     38     d1[n] = 0;
     39     q[0] = n;
     40     inq[n] = 1;
     41     while (t <= w) {
     42         int now = q[t++];
     43         for (int i = head[now]; i; i = e[i].next) {
     44             if (d1[now] + e[i].v1 < d1[e[i].to]) {
     45                 d1[e[i].to] = d1[now] + e[i].v1;
     46                 if (!inq[e[i].to]) {
     47                     q[++w] = e[i].to;
     48                     inq[e[i].to] = 1;
     49                 }
     50             }
     51         }
     52         inq[now] = 0;
     53     }
     54 }
     55  
     56 void spfa2() {
     57     int q[MAXN], t = 0, w = 0;
     58     bool inq[10001];
     59     memset(inq, 0, sizeof (inq));
     60     memset(d2, 127, sizeof (d2));
     61     d2[n] = 0;
     62     q[0] = n;
     63     inq[n] = 1;
     64     while (t <= w) {
     65         int now = q[t++];
     66         for (int i = head[now]; i; i = e[i].next) {
     67             if (d2[now] + e[i].v2 < d2[e[i].to]) {
     68                 d2[e[i].to] = d2[now] + e[i].v2;
     69                 if (!inq[e[i].to]) {
     70                     q[++w] = e[i].to;
     71                     inq[e[i].to] = 1;
     72                 }
     73             }
     74         }
     75         inq[now] = 0;
     76     }
     77 }
     78  
     79 void spfa3() {
     80     int q[MAXN], t = 0, w = 0;
     81     bool inq[10001];
     82     memset(inq, 0, sizeof (inq));
     83     memset(dis, 127, sizeof (dis));
     84     dis[1] = 0;
     85     q[0] = 1;
     86     inq[1] = 1;
     87     while (t <= w) {
     88         int now = q[t++];
     89         for (int i = h[now]; i; i = d[i].next) {
     90             if (dis[now] + d[i].v1 < dis[d[i].to]) {
     91                 dis[d[i].to] = dis[now] + d[i].v1;
     92                 if (!inq[d[i].to]) {
     93                     q[++w] = d[i].to;
     94                     inq[e[i].to] = 1;
     95                 }
     96             }
     97         }
     98         inq[now] = 0;
     99     }
    100 }
    101  
    102 int main() {
    103     n = read();
    104     m = read();
    105     for (int i = 1; i <= m; i++) {
    106         u[i] = read();
    107         v[i] = read();
    108         w1[i] = read();
    109         w2[i] = read();
    110         ins(v[i], u[i], w1[i], w2[i]);
    111     }
    112     spfa1();
    113     spfa2();
    114     for (int i = 1; i <= m; i++) {
    115         d[i].to = v[i];
    116         d[i].next = h[u[i]];
    117         h[u[i]] = i;
    118         if (d1[v[i]] + w1[i] > d1[u[i]])d[i].v1++;
    119         if (d2[v[i]] + w2[i] > d2[u[i]])d[i].v1++;
    120     }
    121     spfa3();
    122     printf("%d", dis[n]);
    123     return 0;
    124 }
    View Code
  • 相关阅读:
    【转】解决javascript中replace只能替换第一个
    【原】SQL存储过程调用慢,但是重新编译一下存储过程就很快
    【转】iframe自适应高度
    【原】JS点击层外任何地方关闭层
    【原】Iframe with SimpleModal keeps breaking down in IE 9 IE 7
    【原】SQL Server get csv group by
    【原】JQuery Masked Input Plugin
    【原】SQL 取当前年 (年初 1月1号) 当前月 (月初 1号) 当前日 (零点)
    vue 路由配置 和 react 路由配置
    react的几种性能优化
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4006753.html
Copyright © 2011-2022 走看看