Cod sursa(job #889885)

Utilizator the@EyE@Postavaru Stefan the@EyE@ Data 24 februarie 2013 18:57:04
Problema Algoritmul Bellman-Ford Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#define INF 50002
#define MAX 1666

using namespace std;

struct edge
{
    int x,y,c;
};

vector<edge> edges;
int dist[INF],n,m,ind=0;
char buff[MAX];

void pRead(int &n)
{
    int x=0,sgn=1;
     while((buff[ind]<'0'||buff[ind]>'9')&&buff[ind]!='-')
    {
        ++ind;
        if(ind==MAX){fread(buff,1,MAX,stdin);ind=0;}
    }
    if(buff[ind]=='-'){sgn=-1;++ind; if(ind==MAX){fread(buff,1,MAX,stdin);ind=0;}}
    while(buff[ind]>='0'&&buff[ind]<='9')
    {
        x=x*10+buff[ind]-48;
        ++ind;
        if(ind==MAX){fread(buff,1,MAX,stdin);ind=0;}
    }
    n=x*sgn;
}

int main()
{
    freopen("bellmanford.in","r",stdin);
    freopen("bellmanford.out","w",stdout);
    pRead(n);pRead(m);
    for(int i=0;i<m;++i)
    {
        edge e;
        pRead(e.x);pRead(e.y);pRead(e.c);
        edges.push_back(e);
    }
    for(int i=1;i<=n;++i)dist[i]=99999999;
    bool ok=1;
    dist[1]=0;
    for(int i=0;ok&&i<n-1;++i)
    {
        ok=0;

        for(int j=0;j<edges.size();++j)
        {
            edge e=edges[j];
            if(dist[e.y]>dist[e.x]+e.c){dist[e.y]=dist[e.x]+e.c;ok=1;}
        }
    }
    for(int j=0;j<edges.size();++j)
        {
            edge e=edges[j];
            if(dist[e.y]>dist[e.x]+e.c){printf("Ciclu negativ!\n");return 0;}
        }
     for(int i=2;i<=n;++i)printf("%d ",dist[i]);
     return 0;
}