/*
HDOJ 3592
典型的差分约束问题
x <= a-b <= y
a-b >= x
b-a <= -x
全部转化为<=的形式,求上界,最短路
*/
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
#define INF 1000009
#define MAXN 1005
struct edge
{
int to;
int weight;
};
vector <edge> adjmap[MAXN];
bool in_queue[MAXN]; //顶点是否在队列中
int in_sum[MAXN]; //顶点入队次数
int dist[MAXN]; //源点到各点的最短路径
int n;
bool SPFA(int source)
{
deque <int> dq;
int i,j,x,to;
for(i=1;i<=n;i++)
{
in_sum[i]=0;
in_queue[i]=false;
dist[i]=INF;
}
dq.push_back(source);
in_sum[source]++;
in_queue[source]=true;
dist[source]=0;
while(!dq.empty())
{
x=dq.front();
dq.pop_front();
in_queue[x]=false;
for(i=0;i<adjmap[x].size();i++)
{
to=adjmap[x][i].to;
if((dist[x] < INF)&&(dist[to] > dist[x]+adjmap[x][i].weight))
{
dist[to]=dist[x]+adjmap[x][i].weight;
if(!in_queue[to])
{
in_queue[to]=true;
in_sum[to]++;
if(in_sum[to] == n)
return false;
if(!dq.empty())
{
if(dist[to] > dist[dq.front()])
dq.push_back(to);
else
dq.push_front(to);
}
else
dq.push_back(to);
}
}
}
}
return true;
}
int main()
{
int nCase,xn,yn,i,j,a,b,c;
edge temp;
cin>>nCase;
while(nCase--)
{
cin>>n>>xn>>yn;
for(i=0;i<=n;i++)
adjmap[i].clear();
for(i=0;i<xn;i++)
{
cin>>a>>b>>c;
temp.to=b;
temp.weight=c;
adjmap[a].push_back(temp);
}
for(i=0;i<yn;i++)
{
cin>>a>>b>>c;
temp.to=a;
temp.weight= -c;
adjmap[b].push_back(temp);
}
if(SPFA(1))
{
if(dist[n]!=INF)
cout<<dist[n]<<endl;
else
cout<<-2<<endl;
}
else
cout<<-1<<endl;
}
return 0;
}
12-19
243

08-28
748

“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交