Wormholes--POJ 3259

1、题目类型:图论、最短路径、Bellman-Ford算法。

2、解题思路:(1)根据输入记录所有的边,其中无向边转换为有向边记录;(2)Bellman-Ford算法松弛所有的边,寻找是否存在负圈。

3、注意事项:注意Mov[]数组的大小。

4、实现方法:

#include<iostream>
using namespace std;
#define Maxn 510
#define Maxw 6000
#define INF 99999

struct TMove{
int s,e,t;
};
TMove Mov[Maxw];
int n,m,w,flag,cnt;

void Bellman_ford()
{
int i,j,start,end,time;
double d[Maxn];
for (i=0;i<n;i++)
d[i]
=INF;
d[
0]=0;
for (i=1;i<n;i++)
{
for (j=0;j<cnt;j++)
{
start
=Mov[j].s;
end
=Mov[j].e;
time
=Mov[j].t;
if (d[end]>d[start]+time)
d[end]
=d[start]+time;
}
}
for (j=0;j<cnt;j++)
{
start
=Mov[j].s;
end
=Mov[j].e;
time
=Mov[j].t;
if (d[end]>d[start]+time)
{
flag
=1;
return;
}
}
}

int main()
{
int i,f,s,e,t;
cin
>>f;
while(f--)
{
cin
>>n>>m>>w;
memset(Mov,
0,sizeof(Mov));
flag
=0,cnt=0;
for(i=0;i<m;i++)
{
cin
>>s>>e>>t;
s
--,e--;
Mov[cnt].s
=s;
Mov[cnt].e
=e;
Mov[cnt].t
=t;
cnt
++;
Mov[cnt].s
=e;
Mov[cnt].e
=s;
Mov[cnt].t
=t;
cnt
++;
}
for(i=0;i<w;i++)
{
cin
>>s>>e>>t;
s
--,e--;
Mov[cnt].s
=s;
Mov[cnt].e
=e;
Mov[cnt].t
=-t;
cnt
++;
}
Bellman_ford();
if(flag)
cout
<<"YES"<<endl;
else
cout
<<"NO"<<endl;
}
return 1;
}

 

posted @ 2010-08-11 17:01  勇泽  阅读(381)  评论(0编辑  收藏  举报