Visitors hit counter dreamweaver

poj 3259 bellman-ford

    这题是用bellman-ford求负权回路的问题。数组一定要开5100以上,不然会RE。这是我写的第二题Bellman-ford,写得很顺手了。加油加油~

#include <iostream>
#include <fstream>

using namespace std;
#define MAX 5100
#define FAR 10001

int k,n;  //k为边数 n为顶点数
int dist[MAX];

struct node{
    int start,end;
    int weight;
}edge[MAX];

bool Bellman_ford()
{
    int s,e,t;
    int i,j;
    for(i=1; i<n; i++)
    {
        bool finish=true;
        for(j=0; j<k; j++)
        {
            s=edge[j].start;
            e=edge[j].end;
            t=edge[j].weight;
            if(dist[e]>dist[s]+t)
            {
                dist[e]=dist[s]+t;
                finish=false;
            }
        }
        if(finish)  break;
    }
    for(i=0; i<k; i++)
    {
        s=edge[i].start;
        e=edge[i].end;
        t=edge[i].weight;
        if(dist[e]>dist[s]+t)
        {
            dist[e]=dist[s]+t;
            return true;
        }
    }
    return false;
}

int main()
{
    int farms,s,e,t;
    int i,m,w;
    freopen("acm.txt","r",stdin);
    scanf("%d",&farms);
    while(farms--)
    {
        k=0;
        for(i=0; i<MAX; i++)
        {
             dist[i]=FAR;  //默认最大
        }
        scanf("%d%d%d",&n,&m,&w);
        for(i=0; i<m; i++)
        {
            scanf("%d%d%d",&s,&e,&t);
            edge[k].start=s;
            edge[k].end=e;
            edge[k++].weight=t;
            edge[k].start=e;
            edge[k].end=s;
            edge[k++].weight=t;
        }
        //可退回t seconds
        for(i=0; i<w ;i++)
        {
            scanf("%d%d%d",&s,&e,&t);
            edge[k].start=s;
            edge[k].end=e;
            edge[k++].weight=-t;
        }
        if(Bellman_ford())  printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

 

posted @ 2012-04-21 16:13  Jason Damon  阅读(315)  评论(0)    收藏  举报