zoukankan      html  css  js  c++  java
  • hdu3592(差分约束) (线性)

    题意:一些牛按序号排成一条直线,有两种要求,A和B距离不得超过X,还有一种是A和B距离不得少于Y,问1和N可能的最大距离。

    和poj那题一样,就是多了多组数据。

     1 #include<cstring>
     2 #include<cmath>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cstdio>
     6 #include<queue>
     7 #define INF 2000000007
     8 #define N 1007
     9 #define M 10007
    10 using namespace std;
    11 
    12 int n,l,r;
    13 int dis[N],num[N],ins[N];
    14 int cnt,head[N],Next[M*3],rea[M*3],val[M*3];
    15 
    16 void add(int u,int v,int fee)
    17 {
    18     Next[++cnt]=head[u];
    19     head[u]=cnt;
    20     rea[cnt]=v;
    21     val[cnt]=fee;
    22 }
    23 bool Spfa()
    24 {
    25     for (int i=1;i<=n;i++)
    26         ins[i]=0,dis[i]=INF,num[i]=0;
    27     queue<int>q;
    28     q.push(1);dis[1]=0,num[1]=1;
    29     while(!q.empty())
    30     {
    31         int u=q.front();q.pop();
    32         for (int i=head[u];i!=-1;i=Next[i])
    33         {
    34             int v=rea[i],fee=val[i];
    35             if (dis[v]>dis[u]+fee)
    36             {
    37                 dis[v]=dis[u]+fee;
    38                 if (!ins[v])
    39                 {
    40                     num[v]++;
    41                     ins[v]=1;
    42                     q.push(v);
    43                     if (num[v]>n) return false;
    44                 }
    45             }
    46         }
    47         ins[u]=0;
    48     }
    49     return true;
    50 }
    51 int main()
    52 {
    53     int T;scanf("%d",&T);
    54     while(T--)
    55     {
    56         cnt=0;
    57         memset(head,-1,sizeof(head));
    58         scanf("%d%d%d",&n,&l,&r);
    59         for (int i=1,x,y,z;i<=l;i++)
    60         {
    61             scanf("%d%d%d",&x,&y,&z);
    62             add(x,y,z);
    63         }
    64         for (int i=1,x,y,z;i<=r;i++)
    65         {
    66             scanf("%d%d%d",&x,&y,&z);
    67             add(y,x,-z);
    68         }
    69         for (int i=2;i<=n;i++)
    70             add(i+1,i,0);    
    71         bool flag=Spfa();
    72         if (!flag) printf("-1
    ");
    73         else
    74         {
    75             if (dis[n]==INF) printf("-2
    ");
    76             else printf("%d
    ",dis[n]);
    77         }
    78     }
    79 }
  • 相关阅读:
    设计模式
    雨夹雪背景特效
    lottie-前端实现AE动效
    响应式布局实现原理
    关于小程序(含uniapp)中使用npm模块
    使用脚手架快速搭建React项目
    vue项目接入友盟统计站点数据
    git常用命令
    uniapp请求方法的封装
    小程序获取用户登录及手机号登录
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/7766925.html
Copyright © 2011-2022 走看看