poj 3169

题意:n头牛编号为1到n,按照编号的顺序排成一列,每两头牛的之间的距离 >= 0。这些牛的距离存在着一些约束关系:1.有ml组(u, v, w)的约束关系,表示牛[u]和牛[v]之间的距离必须 <= w。2.有md组(u, v, w)的约束关系,表示牛[u]和牛[v]之间的距离必须 >= w。问如果这n头无法排成队伍,则输出-1,如果牛[1]和牛[n]的距离可以无限远,则输出-2,否则则输出牛[1]和牛[n]之间的最大距离。

代码:

#include<iostream>
#include<fstream>
#include<queue>

using namespace std;

struct e{
	int data;
	int w;
	e *next;
};

e edge[1001];
int v[1001];
int cnt[1001];
int d[1001];
int n,ml,md;

void spfa(){
	int i,j,k;
	queue<int> q;
	for(i=2;i<=n;i++)
		d[i]=100000000;
	q.push(1);
	v[1]=0;
	cnt[1]=1;
	while(!q.empty())
	{
		i=q.front();
		q.pop();
		v[i]=0;
	
		e *p=edge[i].next;
		while(p){
			if(d[p->data]>d[i]+p->w)
			{
				d[p->data]=d[i]+p->w;
				if(v[p->data]==0)
				{
					v[p->data]=1;
					cnt[p->data]++;
					if(cnt[p->data]>n)
					{
						cout<<-1<<endl;
						return;
					}
					q.push(p->data);
				}
			}
			p=p->next;
		}
	}
	if(d[n]==100000000) cout<<-2<<endl;
	else
		cout<<d[n]<<endl;
}

void read(){
//	ifstream cin("in.txt");
	int i,j,k,w;
	cin>>n>>ml>>md;
	for(i=2;i<=n;i++)
	{
		e *p=new e;
		p->data=i-1;
		p->w=0;
		p->next=edge[i].next;
		edge[i].next=p;
	}
	for(i=1;i<=ml;i++)
	{
		cin>>j>>k>>w;
		e *p=new e;
		p->data=k;
		p->w=w;
		p->next=edge[j].next;
		edge[j].next=p;
	}
	for(i=1;i<=md;i++)
	{
		cin>>j>>k>>w;
		e *p=new e;
		p->data=j;
		p->w=-w;
		p->next=edge[k].next;
		edge[k].next=p;
	}
	spfa();
}

int main(){
	read();
	return 0;
}

posted on 2011-05-17 14:59  宇宙吾心  阅读(341)  评论(0)    收藏  举报

导航