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.
Line 1: Three space-separated integers: N, ML, and MD.
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.
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.
Line 1: A single integer. If no line-up is possible, output -1. If cows 1 and N can be arbitrarily far apart, output -2. Otherwise output the greatest possible distance between cows 1 and N.
4 2 1 1 3 10 2 4 20 2 3 3
27
Explanation of the sample:
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.
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.
题目大概的意思就是说有从1-n编号的牛,有一些牛相互讨厌,有一些牛相互喜欢,所有牛与牛的距离有一定的范围,相互喜欢的牛有距离最大值,相互讨厌的牛有距离最小值.
#include<stdio.h>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
struct aa
{
int u,v,w,next;
} edge[38000];
bool vis[1080];
int dist[1080];
int cnt,n;
int per[1080];
int time1[1080];
void init()
{
for(int i=1; i<=n; i++)
{
dist[i]=0x3f3f3f3f;
vis[i]=0;
per[i]=-1;
time1[i]=0;
}
}
void add(int u,int v,int w)
{
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=per[u];
per[u]=cnt++;
}
void spfa()
{
dist[1]=0;
queue<int>ycq;
ycq.push(1);
time1[1]++;
while(!ycq.empty())
{
int t=ycq.front();
vis[t]=0;
ycq.pop();
for(int i=per[t]; i!=-1; i=edge[i].next)
{
int u=edge[i].u,v=edge[i].v,w=edge[i].w;
if(dist[v]>dist[u]+w)
{
dist[v]=dist[u]+w;
// printf("%d %d %d %d\n",u,v,dist[u],dist[v]);
if(!vis[v])
{
vis[v]=1;
ycq.push(v);
time1[v]++;
if(time1[v]>n)
{
printf("-1\n");
return ;
}
}
}
}
}
if(dist[n]==0x3f3f3f3f)
{
printf("-2\n");
return ;
}
printf("%d\n",dist[n]);
return ;
}
int main()
{
int m1,m2;
while(scanf("%d%d%d",&n,&m1,&m2)!=EOF)
{
init();
while(m1--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(u>v)
swap(u,v);//小节点指向大节点
add(u,v,w);
}
while(m2--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(u>v)
swap(u,v);
add(v,u,-w);
}
spfa();
}
}