Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 6662 | Accepted: 3220 |
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
/*
13074017 motefly 3169 Accepted 4644K 110MS G++ 1607B 2014-07-14 11:17:08
*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAX_V=1005;
const int INF=0x3f3f3f3f;
int N,ML,MD;
int cnt;
int G[MAX_V][MAX_V];
int d[MAX_V],ord[MAX_V],mark[MAX_V];
void init()
{
memset(G,INF,sizeof(G));
scanf("%d%d%d",&N,&ML,&MD);
for(int i=1;i<=N;i++)
G[i][i-1]=0;
for(int i=0;i<ML;i++)
{
int f,t,c;
scanf("%d%d%d",&f,&t,&c);
G[f][t]=c;
if(f+1!=t&&t+1!=f)
cnt++;
}
for(int i=0;i<MD;i++)
{
int f,t,c;
scanf("%d%d%d",&f,&t,&c);
G[t][f]=-c;
if(f+1!=t&&t+1!=f)
cnt++;
}
cnt+=N-1;
}
int spfa(int v)
{
for(int i=1;i<=N;i++)
d[i]=INF;
queue<int> q;
q.push(v);
ord[v]=1;
mark[v]=1;
d[v]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
mark[u]=0;
for(int i=1;i<=N;i++)
{
if(G[u][i]!=INF)
{
if(d[u]+G[u][i]<d[i])
{
d[i]=d[u]+G[u][i];
ord[i]=ord[u]+1;
if(!mark[i])
{
q.push(i);
mark[i]=1;
}
if(ord[i]>cnt)
return -1;
}
}
}
}
if(d[N]==INF)
return -2;
return d[N];
}
int main()
{
init();
cout<<spfa(1)<<endl;
return 0;
}