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