Layout(spfa)

Layout


https://vjudge.net/contest/481085#problem/J

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;

const int N=1010, M=21010, inf=0x3f3f3f3f;

int n,ml,md;
int e[M],w[M],ne[M],h[N],idx;
int d[N],cnt[N];
bool st[N];
void add(int a,int b,int c)
{
	e[idx]=b;
	w[idx]=c;
	ne[idx]=h[a];
	h[a]=idx++;
}
bool spfa(int size)
{
	memset(d,0x3f,sizeof d);
    memset(cnt,0,sizeof cnt);
    memset(st,false,sizeof st);
	queue<int>q;
	for(int i=1;i<=size;i++)
	{
		q.push(i);
		d[i]=0;
		st[i]=true;
	}
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		st[u]=false;
		for(int i=h[u];~i;i=ne[i])
		{
			int j=e[i];
			if(d[j]>d[u]+w[i])
			{
				d[j]=d[u]+w[i];
				cnt[j]=cnt[u]+1;
				if(cnt[j]>=n)return true;
				if(!st[j])
				{
					q.push(j);
					st[j]=true;
				}
			}
		}
	}
	return false;
}
int main()
{
	cin>>n>>ml>>md;
	memset(h,-1,sizeof h);
    for(int i=1;i<n;i++)
		add(i+1,i,0);
	for(int i=1;i<=ml;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		if(a>b)swap(a,b);
		add(a,b,c);
	}
	for(int i=1;i<=md;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		if(a>b)swap(a,b);
		add(b,a,-c);
	}
	if(spfa(n))cout<<"-1"<<endl;
	else
	{
		spfa(1);
		if(d[n]==inf)cout<<"-2"<<endl;
		else cout<<d[n]<<endl;
	}
	return 0;
}

 

posted @ 2022-04-08 22:50  是橙橙吖  Views(73)  Comments(0)    收藏  举报