zoukankan      html  css  js  c++  java
  • POJ 3169 Layout

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

    //转化为有向图求 最短路
    //这道题 加深对Bellman_ford使用 和理解
    //但是太难了感觉确实 -->> 确实是差分约束系统的题 但是刚好和最短路 的推导形式相符

    最短路的推导

    如果u v之间有cost = w的边e(u,v)

    dist[v] = min(dist[v], dist[u]+w);

    那么如下理解

    // i 和 i+1有一条为0的边
    // AL+DL >= BL ALi 和 BLi之间有一条权重为DLi的边
    // AD+DD <= BD --->> BD - DD >= AD --->> ADi 和 BDi之间有一条权重为-DDi的边

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string.h>
     4 #define READ() freopen("in.txt", "r", stdin);
     5 #define MAXV 10007
     6 #define INF 0x3f3f3f3f
     7 using namespace std;
     8 
     9 int AL[MAXV], BL[MAXV], DL[MAXV];
    10 int AD[MAXV], BD[MAXV], DD[MAXV];
    11 int N, ML, MD;
    12 
    13 
    14 int Bellman_ford()
    15 {
    16     int dist[MAXV];
    17     fill(dist, dist+MAXV, INF);
    18     dist[1] = 0;
    19     for (int k = 0; k < N; k++)//最多循环k-1次 Bellman_ford就是 在这k-1次循环中 遍历所有的边
    20     {
    21         for (int i = 1; i < N; i++) // i 和 i+1有一条为0的边
    22             if (dist[i+1] < INF) dist[i] = min(dist[i], dist[i+1]);
    23         for (int i = 0; i < ML; i++) // AL+DL >= BL ALi 和 BLi之间有一条权重为DLi的边
    24             if (dist[AL[i]] < INF) dist[BL[i]] = min(dist[BL[i]], dist[AL[i]] + DL[i]);
    25         for (int i = 0; i < MD; i++) // AD+DD <= BD --->> BD - DD >= AD --->> ADi 和 BDi之间有一条权重为-DDi的边
    26             if (dist[BD[i]] < INF) dist[AD[i]] = min(dist[AD[i]], dist[BD[i]] - DD[i]);
    27     }
    28     if (dist[1] < 0)
    29         return -1;//有负圈
    30     else if (dist[N] == INF)
    31         return -2;//无法到达
    32     else return dist[N];
    33 }
    34 
    35 
    36 
    37 int main()
    38 {
    39     READ();
    40     scanf("%d%d%d", &N, &ML, &MD);
    41     for (int i = 0; i < ML; i++)
    42     {
    43         scanf("%d%d%d", &AL[i], &BL[i], &DL[i]);
    44     }
    45     for (int i = 0; i < MD; i++)
    46     {
    47         scanf("%d%d%d", &AD[i], &BD[i], &DD[i]);
    48     }
    49     int ans = Bellman_ford();
    50     cout << ans << endl;
    51 
    52 }
  • 相关阅读:
    青花瓷Java版
    让Broncho A1支持usbnet
    系统程序员成长计划组合的威力(三)
    【转】多CPU上的原子操作
    c#和javascript交互
    修改代码时有时会出现找不到某个组件
    UML用例建模的慨念和应用
    DJ曲二
    查询数据库里的存储过程的文本中的某个内容
    UML静态建模
  • 原文地址:https://www.cnblogs.com/oscar-cnblogs/p/6403903.html
Copyright © 2011-2022 走看看