Cod sursa(job #641687)

Utilizator AnaTudorTudor Ana Maria Mihaela AnaTudor Data 29 noiembrie 2011 02:07:49
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>
#include <vector>

using namespace std;

const int MAX_N = 50002, inf = 1 << 30;
vector <int> cost[MAX_N], muchii[MAX_N];
int N, M, uz[MAX_N], dist[MAX_N];

void read()
{
    int i, x, y, c;
    freopen("dijkstra.in","r",stdin);
    scanf("%d%d",&N,&M);
    for(i=1;i<=M;++i)
    {
        scanf("%d%d%d",&x,&y,&c);
        muchii[x].push_back(y);
        cost[x].push_back(c);
    }
    fclose(stdin);
}

int minim2()
{
    int i, nod, c = inf;
    for(i=1;i<=N;i++)
        if(!uz[i] && dist[i]<c)
            c=dist[i], nod=i;
    return nod;
}

void dijkstra()
{
    int i,j,min;
    for(i=2;i<=N;i++)
        dist[i]=inf;

    for(i=0;i<muchii[1].size();i++)
        dist[muchii[1][i]]=cost[1][i];
    uz[1]=1;
    for(i=1;i<N;i++)
    {
        min=minim2();
        uz[min]=1;
        for(j=0;j<muchii[min].size();j++)
            if(dist[muchii[min][j]]>dist[min]+cost[min][j])
                dist[muchii[min][j]]=dist[min]+cost[min][j];

    }
}

void write()
{
    int i;
    freopen("dijkstra.out","w",stdout);
    for(i=2;i<=N;i++)
        if(dist[i]==inf)
            printf("0 ");
        else
            printf("%d ",dist[i]);
    fclose(stdout);
}

int main()
{
    read();
    dijkstra();
    write();
    return 0;
}