Cod sursa(job #889932)

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

using namespace std;

struct edge
{
    int x,c;
};

vector<edge> graph[INF];
deque<int> Q;
int dist[INF],n,m,ind=0,nrViz[INF];
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;
        int nod;
        pRead(nod);pRead(e.x);pRead(e.c);
        graph[nod].push_back(e);
    }
    for(int i=1;i<=n;++i)dist[i]=99999999;
    dist[1]=0;
    Q.push_back(1);
    while(Q.size()>0)
    {
        int nod=Q[0];
        for(int j=0;j<graph[nod].size();++j)
        {
            edge e=graph[nod][j];
            if(dist[e.x]>dist[nod]+e.c)
            {
                ++nrViz[e.x];
                if(nrViz[e.x]==n){printf("Ciclu negativ!\n");return 0;}
                dist[e.x]=dist[nod]+e.
                c;Q.push_back(e.x);
            }
        }
        Q.pop_front();
    }

     for(int i=2;i<=n;++i)printf("%d ",dist[i]);
     return 0;
}