POJ 3169 Layout (差分约束#5)

当d[n] = inf 时即输出 -2;

#include <cstdio>
#include <algorithm>
#include <cstdlib> 
#include <cstring>
#define N 1010 
#define M 35000
#define MAXQ  35000
using namespace std; 
const int inf = (-1u >> 1); 

int d[N], first[N];
int v[M] , w[M], next[M]; 
bool inq[N];
int cnt[N]; 
int e;
int q[MAXQ];
int indx[N]; 
int t[N]; 


void addE(int x, int y, int c)
{
      next[e] = first[x], first[x] = e;
      v[e] = y;
      w[e] = c; 
      e++;
}

int SPFA(int s, int n)
{
       for (int i = 1; i <= n; i++)d[i] = inf;
       memset(cnt, 0, sizeof(cnt)); 
       d[s] = 0;
       int qs, qe; 
       qs = qe = 0; 
       for (int i = 1; i <= n; i++)inq[i] = false; 
       q[qe++] = s; 
       while (qs != qe)
       {
              int x = q[qs]; 
              inq[x] = false;
              for (int e = first[x]; e != -1; e = next[e])if (d[v[e]] > d[x] + w[e])
              {
                    d[v[e]] = d[x] + w[e]; 
                    if (!inq[v[e]])
                    {
                              inq[v[e]] = true;
                              q[qe++] = v[e];
                              if (qe == MAXQ)qe = 0; 
                              if (++cnt[v[e]] >= n)return -1; 
                    }
              }
              qs++;
              if (qs == MAXQ)qs = 0; 
       }
       if (d[n] == inf)return -2;
       return d[n]; 
} 
int main()
{
      int n, ml, md;
      int A, B, D;
     // FILE* fp = fopen("in.txt", "r"); 
      scanf( "%d %d %d", &n, &ml, &md);
      for (int i = 0; i <= n; i++) first[i] = -1; 
      while (ml--)
      {
            scanf( "%d %d %d", &A, &B, &D);
            if (A > B)A ^= B, B^= A, A ^= B;
            addE(A, B, D);
      }
      while (md--)
      {
             scanf( "%d %d %d", &A, &B, &D);
             if (A > B)A ^= B, B^= A, A ^= B;
             addE(B, A, -D);
      }
      printf("%d\n", SPFA(1, n));
      //getchar();
} 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值