poj 2983 Is the Information Reliable?

#include <iostream>                //差分约束系统,Bellman-Ford算法
using namespace std;


typedef
struct Edge{
int u, v; // 起点,重点
int weight; // 边的权值
}Edge;

Edge edge[
300000]; // 保存边的值
int dist[1010]; // 结点到源点最小距离

int nodenum, e,edgenum; // 结点数,边数,源点

// 初始化图
void init()
{
// 输入结点数,边数 引入附加源点V0

for(int i=1; i<=nodenum; ++i)
dist[i]
= 99999999;
dist[
0] = 0;
char ch;
int a,b,x,i=0;
while(e--)
{
scanf(
" %c",&ch);
if(ch=='P') //P a,b,x a-b=x 可化为两个不等式:a-b>=x, a-b<=x
{
scanf(
"%d %d %d",&a,&b,&x); //cin会TLE
edge[++i].u=a;edge[i].v=b;edge[i].weight=-x;
edge[
++i].u=b;edge[i].v=a;edge[i].weight=x;
}
else
{
scanf(
"%d %d",&a,&b);
edge[
++i].u=a;edge[i].v=b;edge[i].weight=-1;
}
}
edgenum
=i;
}

// 松弛计算
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()
{
while(cin >> nodenum >> e )
{
init();
if(Bellman_Ford())
printf(
"Reliable\n");
else
printf(
"Unreliable\n");
}
return 0;
}

  

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

导航