poj3169 layout

#include <iostream>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <stdio.h>
#define MAX 15000
#define INF 9999999
using namespace std;
class Edge{
public:

    int u,v,w,next;



}edge[MAX];
int head[MAX];
int d[MAX],visit[MAX];
int num=0;
bool inq[MAX];
int n,ml,md,a,b,dis;

int spfa()
{
    for(int i=0;i<n;i++)//i=n 忘了初始化!!!!!!!!!!!
    {
        d[i]=INF;
        inq[i]=false;
        visit[i]=0;
    }
    queue<int> q;
    d[1]=0;
    inq[1]=true;
    q.push(1);

    while(!q.empty())
    {

        int u=q.front();
        q.pop();
      // printf("%d: %d %d\n",u,head[u],edge[head[u]].v);
        inq[u]=false;
        if(visit[u]++>n) return 0;
        for(int e=head[u];e!=-1;e=edge[e].next)
        {
            int v=edge[e].v;
            int w=edge[e].w;
            if(d[v]>d[u]+w)
            {
                d[v]=d[u]+w;
                if(!inq[v])
                {
                    inq[v]=true;
                    q.push(v);
                }
            }
        }
    }
    return 1;
}

void addEdge(int x,int y,int z)
{
    edge[num].u=x;
    edge[num].v=y;
    edge[num].w=z;
    edge[num].next=head[x];
    head[x]=num++;
}
int main()
{



    while(cin>>n>>ml>>md)
    {
         memset(head,-1,sizeof(head));
         num=0;
          for(int i=1;i<=ml;i++)
          {
              cin>>a>>b>>dis;
              addEdge(a,b,dis);
          }
          for(int i=1;i<=md;i++)
          {
              cin>>a>>b>>dis;
              addEdge(b,a,-dis);//这个要反向记录并且 -dis
          }
           if(!spfa())
        {
            printf("-1\n");
        }
        else if(d[n]==INF)
        {
            printf("-2\n");
        }
        else
        {
            printf("%d\n",d[n]);
        }
        }

    return 0;
}

http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html

  1、对于所有的Ax Bx Cx,有 d[Bx] - d[Ax] <= Cx;
      2、对于所有的Ay By Cy,有 d[By] - d[Ay] >= Cy;
      3、然后根据我们的设定,有 d[x] >= d[x-1] + 1 (1 < x <= N)  (这个条件是表示任何两个人的位置不重合)
     而我们需要求的是d[N] - d[1]的最大值,即表示成d[N] - d[1] <= T,要求的就是这个T。
     于是我们将所有的不等式都转化成d[x] - d[y] <= z的形式,如下:
      1、d[Bx]  -  d[Ax]    <=    Cx
      2、d[Ay]  -  d[By]    <=  -Cy
      3、d[x-1] -    d[x]    <=    -1

posted @ 2018-03-29 21:15  LandingGuys  阅读(82)  评论(0编辑  收藏  举报