zoukankan      html  css  js  c++  java
  • wenbao与差分约束

    推荐博客:http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html

     -----------------------------------------------------------

    http://poj.org/problem?id=3169

     1 #include "iostream"
     2 #include <string.h>
     3 #include <stdio.h>
     4 using namespace std;
     5 
     6 #define INF 1e9
     7 const int maxn = 10009*2;
     8 int n, ml, md, index, m;
     9 int head[maxn], to[maxn], pre[maxn], w[maxn], queue[maxn], dis[maxn], cnt[maxn];
    10 
    11 void init() {
    12     index = 1;
    13     for(int i = 1; i <= n; ++i) head[i] = 0, cnt[i] = 0;
    14 }
    15 
    16 void add(int x, int y, int z) {
    17     to[index] = y;
    18     w[index] = z;
    19     pre[index] = head[x];
    20     head[x] = index++;
    21 }
    22 
    23 bool mark[maxn];
    24 
    25 int spfa() {
    26     int front = 0, rear = 0;
    27     for(int i = 1; i <= n; ++i) {
    28         dis[i] = INF;
    29         add(i, i-1, 0);
    30     }
    31     dis[1] = 0;
    32     queue[rear++] = 1;
    33     while(front != rear) {
    34         int k = queue[front++];
    35         mark[k] = false;
    36         for(int i = head[k]; i; i = pre[i]){
    37             if(dis[k] + w[i] < dis[to[i]]) {
    38                 dis[to[i]] = dis[k] + w[i];
    39                 if(!mark[to[i]]) {
    40                     if(++cnt[to[i]] > n) return -1;
    41                     queue[rear++] = to[i];
    42                     mark[to[i]] = true;
    43                 }
    44             }
    45         }
    46     }
    47     if(dis[n] == INF) return -2;
    48     return dis[n];
    49 }
    50 
    51 int main() {
    52 #ifdef wenbao
    53     freopen("in", "r", stdin);
    54 #endif
    55     while(~scanf("%d%d%d", &n, &ml, &md)) {
    56         init();
    57         int x, y, z;
    58         for(int i = 0; i < ml; ++i) {
    59             scanf("%d%d%d", &x, &y, &z);
    60             add(x, y, z);
    61         }
    62         for(int i = 0; i < md; ++i) {
    63             scanf("%d%d%d", &x, &y, &z);
    64             add(y, x, -z);
    65         }
    66         printf("%d
    ", spfa());
    67     }
    68     return 0;
    69 }

    只有不断学习才能进步!

  • 相关阅读:
    【转】Ubuntu 20.04修改ip地址
    试用 Portable Allegro Serve
    看完了 Source Code
    Common Lisp 参数传递的几种形式
    Irony 一个 .NET 语言实现工具包
    PPT 技巧学习
    LISP 练习:quick sort
    关于 Business Rule Engine
    转换 PDF 格式为适合电纸书阅读的版本
    IIS 7 SMTP configuration
  • 原文地址:https://www.cnblogs.com/wenbao/p/7646169.html
Copyright © 2011-2022 走看看