poj 2983 Is the Information Reliable?

33 篇文章 0 订阅

这题参考了别人的思路:

由于P  A  B  X 指“确定AB的距离(边权)为X

P  A  B  X得到的差分系统为

dist[A] - dist[B] >= X  &&  dist[A] - dist[B] <= X

等价于
dist[B] <= dist[A] - X  &&  dist[A] <= dist[B] + X

 if(dist[B] > dist[A]-X) 松弛:dist[B] = dist[A]-X


由于 V  A  B指“只知道AB的距离(边权)至少为1

V  A  B得到的差分系统为
dist[A] >= dist[B] +1

等价于
dist[B] <= dist[A] -1 
if(dist[B] > dist[A] -1) 松弛:dist[B] = dist[A] -1

#include <iostream>
using namespace std; 
const int inf=1000000000;
class
{
public:
    int s,e;
}edge[200001];
int N; 
int M;
int dist[1001]; 
int w[200001];  
int main(int i,int j)
{
    while(cin>>N>>M)
    {
        memset(dist,0,sizeof(dist));
        int pe=0;
        for(i=0;i<M;i++)
        {
            char pv;
            int a,b,x;
            getchar();
            scanf("%c",&pv);
			if(pv=='P')
            {
                scanf("%d%d%d",&a,&b,&x);
                edge[pe].s=a;
                edge[pe].e=b;
                w[pe++]=x;
                edge[pe].s=b;
                edge[pe].e=a;
                w[pe++]=-x;
            }
            else if(pv=='V') 
            {
                scanf("%d%d",&a,&b);
                edge[pe].s=a;
                edge[pe].e=b;
                w[pe++]=1;
            }
        }
        bool sign; 
        for(j=0;j<N;j++)
        {
            sign=false;
            for(i=0;i<pe;i++)
                if(dist[ edge[i].e ] > dist[ edge[i].s ] - w[i])
                {
                    dist[ edge[i].e ] = dist[ edge[i].s ] - w[i];
                    sign=true;
                }  
            if(!sign)
                break;
        }
        if(sign)
			cout<<"Unreliable"<<endl; //存在负权环
        else
            cout<<"Reliable"<<endl;   //不存在负权环
     }
     return 0;
 }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值