poj 3259

这道题目很简单,关键是看懂题目。

题目大意:有F组数据,n个点,m条双向边,w条单向负权边,求有没有负权回路。

SampleInput

2  //F
3 3 1  //n,m,w
1 2 2  
1 3 4
2 3 1
3 1 3
3 2 1
1 2 3
2 3 4
3 1 8

SampleOutput

NO
YES
 
用 bellman-ford 算法做松驰操作,得到如果第n+1次循环仍能松驰,那么存在负权回路。

标程(pascal):

  const

 maxe=10000;

type

 arr=record

   x,y,w,next:longint;

 end;

 

var

 n,m,w,f:longint;

 a:array[1..maxe] of arr;

 d:array[1..maxe] of longint;

 i,j,k:longint;

 

procedurerelax(u,v,w:longint);

begin

  if d[u]+w<d[v] then

    d[v]:=d[u]+w;

end;

 

functionbellman:boolean;

var

  i,j:integer;

begin 

  for i:=1 to n do 

    for j:=1 to m do

      with a[j] do relax(x,y,w);

  for i:=1 to m do 

    with a[i] do

      if d[x]+w<d[y] then exit(true);

  exit(false)

end;

 

begin

 read(f);

 for i:=1 to f do

  begin

    readln(n,m,w);

    fillchar(a,sizeof(a),0);

    fillchar(d,sizeof(d),$7f);

    for j:=1 to m do

     begin

      with a[j*2-1] do

       read(x,y,w);

       a[j*2].x:=a[j*2-1].y;

       a[j*2].y:=a[j*2-1].x;

       a[j*2].w:=a[j*2-1].w;

     end;

    m:=m*2;

    for j:=1 to w do

     with a[j+m] do

      begin

       read(x,y,w);

       w:=-w;

      end;

   d[1]:=0;

   m:=m+w;

  if bellman then write('YES')

             else write('NO');

 end;

end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值