poj 3169 Layout
#include <iostream> //差分约束系统,Bellman-Ford算法
using namespace std;
const int inf=99999999;
typedef struct Edge{
int u, v; // 起点,重点
int weight; // 边的权值
}Edge;
Edge edge[20020]; // 保存边的值
int dist[1005]; // 结点到源点最小距离
int nodenum, e,edgenum; // 结点数,边数,源点
// 初始化图
void init()
{
// 输入结点数,边数 源点为V1
int ml,md;
cin>>nodenum>>ml>>md;
edgenum=ml+md;
for(int i=2; i<=nodenum; ++i)
dist[i] = inf;
dist[1] = 0;
int a,b,d,i=0;
while(ml--)
{
cin>>a>>b>>d;
edge[++i].u=a;edge[i].v=b;edge[i].weight=d;
}
while(md--)
{
cin>>a>>b>>d;
edge[++i].u=b;edge[i].v=a;edge[i].weight=-d;
}
}
// 松弛计算
bool relax(int u, int v, int weight)
{
if(dist[v] > dist[u] + weight)
{
dist[v] = dist[u] + weight;
return 1;
}
return 0;
}
bool Bellman_Ford()
{
for(int i=1; i<=nodenum-1; ++i)
{
int tag=1;
for(int j=1; j<=edgenum; ++j)
{
if(!relax(edge[j].u, edge[j].v, edge[j].weight))
tag=0;
}
if(tag)
break;
}
// 判断是否有负环路
for(int i=1; i<=edgenum; ++i)
if(dist[edge[i].v] > dist[edge[i].u] + edge[i].weight)
return 0;
return 1;
}
int main()
{
init();
if(!Bellman_Ford())
cout<<"-1\n";
else if(dist[nodenum]==inf)
cout<<"-2\n";
else
cout<<dist[nodenum]<<endl;
return 0;
}