zoukankan      html  css  js  c++  java
  • kuangbin_ShortPath S (POJ 3169)

    被cow类题目弄得有些炸裂 想了好久好久写了120多行 依然长跪不起发现计算约束条件的时候还是好多麻烦的地方过不去

    然后看了看kuangbin的blog 都是泪啊 差分约束的方式做起来只要70多行啊炒鸡简洁有没有

    Ps 给手写queue的实现方式跪一下 真是快的飞起

    ------------------Update-------------------

    虽然当时也感叹了一下为什么用最短路的写法解最长路但是没深究 但是看了奚政巨巨的odp(什么鬼格式)之后发现原来一切都来自神奇的差分约束

    约束条件是dist[i] - dist[j] <= c 等价于if(dist[i] > c + dist[j]) dist[i] 就被松弛成dist[j] + c 都是算计啊!

    妙 真是妙(脑补鬼畜)

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <cstring>
     4 #include <queue>
     5 #include <algorithm>
     6 #define INF 0x3F3F3F3F
     7 using namespace std;
     8 
     9 const int MAXN = (int)(1e4 + 10);
    10 const int MAXM = (int)(1e5 + 10);
    11 
    12 int n, ml, md, dist[MAXN];
    13 int size, head[MAXN], point[MAXM], val[MAXM], nxt[MAXM];
    14 
    15 void add (int from, int to, int value)
    16 {
    17     val[size] = value;
    18     point[size] = to;
    19     nxt[size] = head[from];
    20     head[from] = size++;
    21 }
    22 
    23 int  spfa()
    24 {
    25     int time[MAXN];//也许以后用cnt做名字比较好
    26     bool vis[MAXN];
    27     queue<int> q;
    28     memset(vis, false, sizeof vis);
    29     memset(dist, INF, sizeof dist);
    30     memset(time, 0, sizeof time);
    31     
    32     q.push(1);
    33     vis[1] = true;
    34     dist[1] = 0;
    35     while(!q.empty()){
    36         int u = q.front();
    37         q.pop();
    38         vis[u] = false;
    39         for(int i = head[u]; ~i; i = nxt[i]){
    40             if(dist[point[i]] > dist[u] + val[i]){
    41                 dist[point[i]] = dist[u] + val[i];
    42                 if(!vis[point[i]]){
    43                     vis[point[i]] = true;
    44                     q.push(point[i]);
    45                     if(++time[point[i]] > n) return -1;
    46                 }
    47             }
    48         }
    49     }
    50     return dist[n] == INF ? -2 : dist[n];
    51 }
    52 
    53 int main()
    54 {
    55     size = 0;
    56     memset(head, -1, sizeof head);
    57     
    58     scanf("%d%d%d", &n, &ml, &md);
    59     while(ml--){
    60         int from, to, value;
    61         scanf("%d%d%d", &from, &to, &value);
    62         if(from > to) swap(from, to);
    63         add(from, to, value);
    64     }
    65     while(md--){
    66         int from, to, value;
    67         scanf("%d%d%d", &from, &to, &value);
    68         if(from < to) swap(from, to);
    69         add(from, to, -value);
    70     }
    71     int ans = spfa();
    72     printf("%d
    ", ans);
    73     return 0;
    74 }
  • 相关阅读:
    矩阵树定理 / 生成树计数
    NC20811 蓝魔法师 (树形DP/树上01背包)
    Xor-MST学习/ 2020牛客暑假多校(五)B.Graph
    HDU-6820 Tree (2020杭电多校(五) 1007)
    Flipping Coins (概率DP)
    宝石装箱 容斥+dp
    Rabbit的工作(1) (dP)
    Codeforces-1350 E.Orac and Game of Life
    HDU-6563 Strength (贪心)
    HDU-6558 The Moon (期望DP)
  • 原文地址:https://www.cnblogs.com/quasar/p/5138022.html
Copyright © 2011-2022 走看看