Cod sursa(job #1205543)

Utilizator gabib97Gabriel Boroghina gabib97 Data 7 iulie 2014 12:31:41
Problema Algoritmul Bellman-Ford Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 2.49 kb
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include <vector>
#include <ctype.h>
#define inf 1000000000
using namespace std;
int i,n,m,*d,lg,j,k,sw,*arcx,*arcy,*arcc;
long long nr;
char *F;
struct graf
{
    int y,c;
    bool f;
}g;
vector< graf > G[50005];
class comp
{
public:
    bool operator() (const int &a, const int &b)
    {
        return d[a]>d[b];
    }
};
priority_queue<int, vector<int>, comp> H;
void init()
{
    int x,y,c;
    fseek(stdin,0,SEEK_END);
    lg=ftell(stdin);
    rewind(stdin);
    F=(char*) calloc(lg+1,sizeof(char));
    fread(F,sizeof(char),lg,stdin);
    for (i=0;isdigit(F[i]);i++) n=n*10+F[i]-'0';
    j=i+1;
    for (i=j;isdigit(F[i]);i++) m=m*10+F[i]-'0';
    arcx=(int*) calloc(m+1,sizeof(int));
    arcy=(int*) calloc(m+1,sizeof(int));
    arcc=(int*) calloc(m+1,sizeof(int));
    for (k=1;k<=m;k++)
    {
        x=y=c=0;
        j=i+1; sw=0;
        if (F[j]=='-') {sw=1; j++;}
        for (i=j;isdigit(F[i]);i++) x=x*10+F[i]-'0';
        if (sw) x*=-1;
        j=i+1; sw=0;
        if (F[j]=='-') {sw=1; j++;}
        for (i=j;isdigit(F[i]);i++) y=y*10+F[i]-'0';
        if (sw) y*=-1;
        j=i+1; sw=0;
        if (F[j]=='-') {sw=1; j++;}
        for (i=j;isdigit(F[i]);i++) c=c*10+F[i]-'0';
        if (sw) c*=-1;
        g.y=y; g.c=c; g.f=0;
        G[x].push_back(g);
        arcx[k]=x; arcy[k]=y; arcc[k]=c;
    }
    free(F);
    d=(int*) calloc(n+1,sizeof(int));
    for (i=1;i<=n;i++) d[i]=inf;
}
void dijkstra(int s)
{
    int x,y,c,z;
    d[s]=0; H.push(s);
    while (!H.empty()&&nr<=n*m)
    {
        x=H.top();
        H.pop();
        z=G[x].size();
        for (i=0;i<z;i++)
        {
            y=G[x][i].y;
            c=G[x][i].c;
            if (d[y]>d[x]+c)
            {
                d[y]=d[x]+c;
                /*if (G[x][i].f)
                {
                    printf("Ciclu negativ!");
                    exit(0);
                }*/
                G[x][i].f=1;
                H.push(y);
            }
        }
    }
}
bool verif_negativ()
{
    int i;
    for (i=1;i<=m;i++)
        if (d[arcy[i]]>d[arcx[i]]+arcc[i]) return true;
    return false;
}
int main()
{
    freopen ("bellmanford.in","r",stdin);
    freopen ("bellmanford.out","w",stdout);
    init();
    dijkstra(1);
    if (verif_negativ()) printf("Ciclu negativ!");
    else
        for (i=2;i<=n;i++) printf("%i ",d[i]);
    fclose(stdin);
    fclose(stdout);
    return 0;
}