• 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 }
  • 相关阅读:
    主成分分析法(PCA)答疑
    搜索引擎的高级用法
    Makefile 编写实例
    GCC常用命令
    一个进程最多能开多少个线程?
    归并排序
    选择排序(数组、链表)
    求连续子数组的最大和
    生产者-消费者问题(1)
    基于cmake编译安装MySQL-5.5
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/7766925.html
Copyright © 2020-2023  润新知