• poj 3169 Layout


    题意:

    n头牛编号为1到n,按照编号的顺序排成一列,每两头牛的之间的距离 >= 0。这些牛的距离存在着一些约束关系:1.有ml组(u, v, w)的约束关系,表示牛[u]和牛[v]之间的距离必须 <= w。2.有md组(u, v, w)的约束关系,表示牛[u]和牛[v]之间的距离必须 >= w。问如果这n头无法排成队伍,则输出-1,如果牛[1]和牛[n]的距离可以无限远,则输出-2,否则则输出牛[1]和牛[n]之间的最大距离。

    分析:

    三个式子:

    1、s[i+1]-s[i]>=0  ==>  s[i]-s[i+1]<=0

    2、ML 时:s[end]-s[st]<=x

    3、MD 时: s[end]-s[st]>=x ==> s[st]-s[end]<=-x

    View Code
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 
     6 using namespace std;
     7 
     8 #define inf 100000000
     9 struct Edge
    10 {
    11     int s,e;
    12     int val;
    13 }edge[25000];
    14 
    15 int pe;
    16 int N,ML,MD;
    17 int dis[1100];
    18 
    19 bool bellman_ford()
    20 {
    21     bool sign;
    22 
    23     for(int j=0;j<N+1;j++)
    24     {
    25         sign=false;
    26         for(int i=0;i<pe;i++)
    27             if(dis[edge[i].e] > dis[edge[i].s] + edge[i].val)
    28             {
    29                 dis[edge[i].e] = dis[edge[i].s] + edge[i].val;
    30                 sign=true;
    31             }
    32         if(!sign)
    33             break;
    34     }
    35     if(sign)
    36         return false;//存在负环
    37     else
    38         return true;
    39 }
    40 
    41 int main()
    42 {
    43     while(scanf("%d%d%d",&N,&ML,&MD) !=EOF)
    44     {
    45         for(int i=0;i<1100;i++)
    46             dis[i]=inf;
    47         dis[0]=0;
    48         dis[1]=0;
    49         pe=0;
    50 
    51         int a,b,x;
    52         for(int i=1;i<=N-1;i++)
    53         {
    54             edge[pe].s=i+1;
    55             edge[pe].e=i;
    56             edge[pe++].val=0;
    57         }
    58         for(int i=0;i<ML;i++)
    59         {
    60             scanf("%d%d%d",&a,&b,&x);
    61             edge[pe].s=a;
    62             edge[pe].e=b;
    63             edge[pe++].val=x;
    64         }
    65         for(int i=0;i<MD;i++)
    66         {
    67             scanf("%d%d%d",&a,&b,&x);
    68             edge[pe].s=b;
    69             edge[pe].e=a;
    70             edge[pe++].val=-x;
    71         }
    72     
    73         if(bellman_ford() && dis[N] != inf)
    74             printf("%d\n",dis[N]);
    75         else if(dis[N] == inf)
    76             puts("-2");
    77         else
    78             puts("-1");
    79     }
    80     return 0;
    81 }

     

     

  • 相关阅读:
    20200213 超级聊天术
    20220210 java.util.Properties
    20220210 java.util.concurrent.BlockingQueue 方法说明
    20220210 java.util.Queue
    20220210 java.lang.Long
    20220210 Java 反射基础类
    一组很有意思的Principles
    python logging用法的简单总结
    好好的Typora收费了!_2022_01_20
    一些常用的jQuery方法1_20220128
  • 原文地址:https://www.cnblogs.com/Missa/p/2660332.html
Copyright © 2020-2023  润新知