Cod sursa(job #679484)

Utilizator GaborGabrielFMI - GabrielG GaborGabriel Data 13 februarie 2012 12:49:17
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
#include <climits>


int i,j,n,m,col[50005],pi[50005],coada[50005],in=1,sf=0,acum,k,q;

struct nod{
    int x,cost;
    nod*urm;
}*Z[50005],*p;

int main()
{
    int a,b,c;
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>a>>b>>c;
        p = new nod;
        p->x = a;
        p->cost = c;
        p->urm = Z[b];
        Z[b] = p;

        p=new nod;
        p->x = b;
        p->cost = c;
        p->urm = Z[a];
        Z[a] = p;
    }
    p = Z[1];
    pi[1]=0;
    col[1]=2;
    int ok=0;
    while(p)
    {
        k = p->x;
        pi[k] = p->cost;
        coada[++sf] = k;
        col[k]=1;
        p=p->urm;
    }
    while(in<=sf)
    {
        ok=0;
        acum = coada[in];
        p = Z[acum];
        while(p)
        {
            q=p->x;
            if(col[q]==2 && pi[q] > pi[acum] + p->cost)
            {
                ok=1;
                coada[in] = q;
                pi[q] = pi[acum] + p->cost;
                col[q]=1;
            }
            if(col[q]==0)
            {
                coada[++sf] = q;
                pi[q] = pi[acum] + p->cost;
                col[q]=1;
            }
            else
                if(col[q]==1 && pi[q] > pi[acum] + p->cost)
                    pi[q] = pi[acum] + p->cost;
            p=p->urm;
        }
        col[acum]=2;
        if(ok==0)
          in++;
    }
    for(i=2;i<=n;i++)
        g<<pi[i]<<' ';
    f.close();
    g.close();
    return 0;
}