3767 - 奶牛排队

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

像每个人一样,奶牛们喜欢在排队等待领取食物和自己的朋友站在一起。FJ拥有N头奶牛,编号为1至N。它们站成一行,等待FJ派送奶牛营养餐。这些奶牛按照编号大小排列,并且由于它们都很想早点吃饭,于是就很可能出现多头奶牛挤在同一位置的情况(也就是说,如果我们认为奶牛位于数轴上,那么多头奶牛的位置坐标可能相同)。

某些奶牛之间互相喜欢,它们希望互相之间的距离至多为一个定值。某些奶牛之间互相厌恶,它们希望互相之间的距离至少为一个定值。现在给定ML个互相喜爱的奶牛对以及它们之间距离的最大值,MD个互相厌恶的奶牛对以及它们之间距离的最小值。

    你的任务是计算在满足以上条件的前提下,编号为1和编号为N的奶牛之间距离的最大可能值。

题目输入

题目输出

输出文件仅包含一个整数。如果不存在任何合法的排队方式,就输出-1。如果编号1和编号N的奶牛间距离可以任意,就输出-2 。否则输出它们之间的最大可能距离。

输入/输出样例

输入格式

4 2 1
1 3 10
2 4 20
2 3 3

输出格式

27

C++解答

//ALGORIHTM::DC
//AUTHOR::STDAFX

#define MAXE 50000UL
#define MAXN 2000UL
#define INF 100000000L

#include <cstdio>
#include <cstring>

using namespace std;

bool SPFA();

struct Edge{
	int v,nx,w;
};

struct stack{
	int head,data[MAXE];
	inline int top(){
		return data[head];
	}
	inline bool empty(){
		return head==0;
	}
	inline void pop(){
		head--;
		return;
	}
	inline void push(int temp){
		data[++head]=temp;
		return;
	}
};

Edge edge[MAXE];

int n,ml,md,indgr[MAXN],headlist[MAXN],a,b,k,ec,dx[MAXN];

bool ex[MAXN];

stack sta;

int main(){
	scanf("%d%d%d",&n,&ml,&md);
	for(int i=1;i<=ml;i++){
		//a->b w=k;
		scanf("%d%d%d",&a,&b,&k);
		edge[++ec].v=b;
		edge[ec].w=k;
		edge[ec].nx=headlist[a];
		headlist[a]=ec;
	}
	for(int i=1;i<=md;i++){
		//b->a w=-k
		scanf("%d%d%d",&a,&b,&k);
		edge[++ec].v=a;
		edge[ec].w=-k;
		edge[ec].nx=headlist[b];
		headlist[b]=ec;
	}
	for(int i=1;i<n;i++){
		//i+1->i
		edge[++ec].v=i;
		edge[ec].w=0;
		edge[ec].nx=headlist[i+1];
		headlist[i+1]=ec;
	}
	if(!SPFA()){
		printf("-1");
	}
	else if(dx[n]>INF){
		printf("-2");
	}
	else{
		printf("%d",dx[n]);
	}
	return 0;
}

bool SPFA(){
	memset(dx,50,sizeof(dx));dx[1]=0;
	sta.push(1);
	while(!sta.empty()){
		k=sta.top();sta.pop();ex[k]=0;
		for(int i=headlist[k];i!=0;i=edge[i].nx){
			if(dx[edge[i].v]>dx[k]+edge[i].w){
				dx[edge[i].v]=dx[k]+edge[i].w;
				if(!ex[edge[i].v]){
					indgr[edge[i].v]++;
					if(indgr[edge[i].v]>n){
						return false;
					}
					ex[edge[i].v]=1;
					sta.push(edge[i].v);
				}
			}
		}
	}
	return true;
}