Visitors hit counter dreamweaver

poj 1860 Beffman-Ford

      本题用beffman-ford的思想,来求正环回路,一般是用来求负环回路的,但这里只要把比较大小符号转换一下就行了,反正两个都说明图不是收敛的。因为这是第一次做 beffman-ford的题。主要参考了http://blog.sina.com.cn/s/blog_6635898a0100kxu2.html。谢谢他。

     加油吧,孩子,不断进步!!

#include <iostream>
#include <fstream> 

using namespace std;
#define MAX 201

int n,m,nums;   //n货币种类,m汇率站点数,s Nick手中的货币种类
double money;  //Nick手中货币的数量
double dist[MAX];

struct Node
{
    int start,end;
    double rate,com;
}edge[MAX];

bool Bellman_ford()
{
    int i,j,st,ed;
    double ra,co;
    for(i=1; i<=n; i++)  //初始化距离
        dist[i]=0;
    dist[nums]=money;
     for(i=1; i<n ; i++)  //n-1条通路
      {
        bool finish=true;  //完全松弛的判断
        for(j=0; j<m; j++)
        {
            st=edge[j].start;
            ed=edge[j].end;
            ra=edge[j].rate;
            co=edge[j].com;
            if( dist[ed]<(dist[st]-co)*ra )  //求可能的最大值
            {
                dist[ed]=(dist[st]-co)*ra;
                finish=false;
            }
        }
        if(finish) break;
    }

    for(i=0; i<m; i++)
    {
        st=edge[i].start;
        ed=edge[i].end;
        ra=edge[i].rate;
        co=edge[i].com;
        if(dist[ed]<(dist[st]-co)*ra)   //不收敛
        {
            dist[ed]=(dist[st]-co)*ra;
            return true;   //有正权回路 
        }
    }
    return false;
}

int main()
{
    int k=0,e,s;
    double r1,r2,c1,c2;
    freopen("acm.txt","r",stdin);
    scanf("%d%d%d%lf",&n,&m,&nums,&money);
    while(m--)
    {
        scanf("%d%d%lf%lf%lf%lf",&s,&e,&r1,&c1,&r2,&c2);
        edge[k].start=s;   //s->e
        edge[k].end=e;
        edge[k].rate=r1;
        edge[k++].com=c1;
        
        edge[k].start=e;   //e->s
        edge[k].end=s;
        edge[k].rate=r2;
        edge[k++].com=c2;
    }
    m=k;
    if(!Bellman_ford()) printf("NO\n");
    else printf("YES\n");
    return 0;
}

 

posted @ 2012-04-21 00:54  Jason Damon  阅读(337)  评论(0)    收藏  举报