标签:差分约束
链接:http://poj.org/problem?id=3169
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 8282 | Accepted: 3972 |
Description
Input
Output
Sample Input
4 2 1 1 3 10 2 4 20 2 3 3
Sample Output
27
Hint
题意及做法:
n只牛 ml个最长距离限制,md个最长距离限制
然后输入ml个a,b d , a点和b点距离要小于等于d。 所以b-a<=d这就是差分约束的基本的方程
然后输入md个a,b,d, a点和b点的距离要大于等于d。所以 b-a>=d =》 a-b<=-d
然后又因为 编号小的 放前面 所以 又可以得到 dian(i)- dian(i+1)<=0
把这ml+md+n条差分约束方程 建边,b-a<=d,就建a到b的边距离为d。
如果最短路跑出的是 -inf 说明是有负环,说明 条件矛盾 -1;
如果抛出的inf,说明1和n两点距离可以无穷大。 -2;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <stack>
#include <queue>
#include <vector>
#include <deque>
#include <set>
#include <map>
#define VM 30005
#define EM 150005
#define inf 0x7f7f7f7f
int head[VM],ep;
struct edge
{
int v,w,next;
}e[EM];
void addedge(int cu,int cv,int cw)
{
ep ++;
e[ep].v = cv;
e[ep].w = cw;
e[ep].next = head[cu];
head[cu] = ep;
}
int spfa (int n)
{
int vis[VM],stack[VM],dis[VM],vn[VM];
memset(vis,0,sizeof(vis));
memset(dis,0x7f7f7f7f,sizeof dis);
memset(vn,0,sizeof vn);
vn[1]=1;
dis[1] = 0;
vis[1] = 1;
int top = 1;
stack[0] = 1;
while (top)
{
int u = stack[--top];
if(vn[u]>n)
return -inf;
vis[u] = 0;
for (int i = head[u];i != -1;i = e[i].next)
{
int v = e[i].v;
if (dis[v] > dis[u] + e[i].w)
{
dis[v] = dis[u] + e[i].w;
if (!vis[v])
{
vis[v] = 1;
vn[v]++;
stack[top++] = v;
}
}
}
}
return dis[n];
}
int main ()
{
int n,m,v1,v2,cost;
int ml,md;
while(scanf("%d%d%d",&n,&ml,&md)!=EOF)
{
ep = 0;
memset (head,-1,sizeof(head));
for(int i=0;i<ml;i++)
{
int u,v,lim;
scanf("%d%d%d",&u,&v,&lim); //v-u<=lim
addedge(u,v,lim);
}
for(int i=0;i<md;i++)
{
int u,v,lim;
scanf("%d%d%d",&u,&v,&lim); //v-u>=lim u-v<=-lim
addedge(v,u,-lim);
}
for(int i=1;i<n;i++)
{
addedge(i+1,i,0);//dian(i)- dian(i+1)<=0
}
int ans=spfa(n);
if(ans==-inf)
puts("-1");//负环 有矛盾条件
else if(ans==inf)//两者可以无线远
puts("-2");
else
printf("%d\n",ans);
}
return 0;
}
/*
4 2 1
1 3 10
2 4 20
2 3 3
*/
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:差分约束
原文地址:http://blog.csdn.net/u013532224/article/details/46864187