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;
}

浙公网安备 33010602011771号