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

  

posted on 2011-07-22 19:55  sysu_mjc  阅读(105)  评论(0编辑  收藏  举报

导航