标签:差分约束
链接: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