Description
Some cows like each other and want to be within a certain distance of each other in line. Some really dislike each other and want to be separated by at least a certain distance. A list of ML (1 <= ML <= 10,000) constraints describes which cows like each other and the maximum distance by which they may be separated; a subsequent list of MD constraints (1 <= MD <= 10,000) tells which cows dislike each other and the minimum distance by which they must be separated.
Your job is to compute, if possible, the maximum possible distance between cow 1 and cow N that satisfies the distance constraints.
Input
Lines 2..ML+1: Each line contains three space-separated positive integers: A, B, and D, with 1 <= A < B <= N. Cows A and B must be at most D (1 <= D <= 1,000,000) apart.
Lines ML+2..ML+MD+1: Each line contains three space-separated positive integers: A, B, and D, with 1 <= A < B <= N. Cows A and B must be at least D (1 <= D <= 1,000,000) apart.
Output
Sample Input
4 2 1 1 3 10 2 4 20 2 3 3
Sample Output
27
Hint
There are 4 cows. Cows #1 and #3 must be no more than 10 units apart, cows #2 and #4 must be no more than 20 units apart, and cows #2 and #3 dislike each other and must be no fewer than 3 units apart.
The best layout, in terms of coordinates on a number line, is to put cow #1 at 0, cow #2 at 7, cow #3 at 10, and cow #4 at 27.
Source
题意:
给出N头牛,他们是依照顺序编号站在一条直线上的,同意有多头牛在同一个位置!
给出ML对牛,他们同意之间的距离小于等于W
给出MD对牛,他们之间的距离必须是大于等于W的
给出ML+MD的约束条件,求1号牛到N号的最大距离dis[N]。
假设dis[N] = INF,则输出-2。
假设他们之间不存在满足要求的方案,输出-1
其余输出dis[N];
代码例如以下:
#include <cstdio> #include <cstring> #include <stack> #include <iostream> #include <algorithm> using namespace std; #define INF 0x3f3f3f3f #define N 20000 #define M 20000 int n, m, k; int Edgehead[N], dis[N]; struct Edge { int v,w,next; } Edge[2*M]; bool vis[N]; int cont[N]; void Addedge(int u, int v, int w) { Edge[k].next = Edgehead[u]; Edge[k].w = w; Edge[k].v = v; Edgehead[u] = k++; } int SPFA( int start)//stack { int sta[N]; memset(cont,0,sizeof(cont); int top = 0; for(int i = 1 ; i <= n ; i++ ) dis[i] = INF; dis[start] = 0; ++cont[start]; memset(vis,false,sizeof(vis)); sta[++top] = start; vis[start] = true; while(top) { int u = sta[top--]; vis[u] = false; for(int i = Edgehead[u]; i != -1; i = Edge[i].next)//注意 { int v = Edge[i].v; int w = Edge[i].w; if(dis[v] > dis[u] + w) { dis[v] = dis[u]+w; if( !vis[v] )//防止出现环 { sta[++top] = v; vis[v] = true; } if(++cont[v] > n)//有负环 return -1; } } } return dis[n]; } int main() { int u, v, w; int c; int ml, md; while(~scanf("%d%d%d",&n,&ml,&md))//n为目的地 { k = 1; memset(Edgehead,-1,sizeof(Edgehead)); for(int i = 1 ; i <= ml; i++ ) { scanf("%d%d%d",&u,&v,&w); Addedge(u,v,w); } for(int i = 1 ; i <= md; i++ ) { scanf("%d%d%d",&u,&v,&w); Addedge(v,u,-w); } for(int i = 1; i < n; i++) { Addedge(i+1,i,0); } int ans = SPFA(1);//从点1開始寻找最短路 if(ans == INF) { printf("-2\n"); } else { printf("%d\n",ans); } } return 0; }