• 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 }

    只有不断学习才能进步!

  • 相关阅读:
    Android 之 进度条样式
    最佳下载实例
    最佳下载实例
    使用git将项目上传到github(最简单方法)
    使用git将项目上传到github(最简单方法)
    打开URL启动android默认浏览器,启动指定浏览器
    打开URL启动android默认浏览器,启动指定浏览器
    android指定浏览器打开特定网页
    【POJ】[3026]Borg Maze
    【POJ】[3026]Borg Maze
  • 原文地址:https://www.cnblogs.com/wenbao/p/7646169.html
Copyright © 2020-2023  润新知