Cod sursa(job #1696312)

Utilizator AcuasPopescu Nicolae-Aurelian Acuas Data 28 aprilie 2016 19:52:51
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 3.02 kb
/*#include <fstream>
#include <vector>
#include <queue>
#include <climits>
#define NMAX 50005
#define INF INT_MAX
using namespace std;
ifstream cin("dijkstra.in");
ofstream cout("dijkstra.out");
vector< pair<int,int> > G[NMAX];
int n,p,D[NMAX],t[NMAX],viz[NMAX],m;
void citire(){
    cin>>n>>m;
    p=1;
    int i,j,x,parcurg;
    for(parcurg=1;parcurg<=m;parcurg++){
        cin>>i>>j>>x;
        G[i].push_back(make_pair(j,x));
    }
}
queue<int> coada;
void dijkstra(){
    viz[p]=1;
    vector< pair <int,int> >::iterator it;
    int i,k;
    for(it=G[p].begin();it!=G[p].end();++it){
        D[it->first]=it->second;
        coada.push(it->first);
        t[it->first]=p;
    }
    for(i=1;i<=n;i++)
        if(D[i]==0){
            D[i]=INF;
            t[i]=0;
        }
    bool ok=1;
    while(ok){
        int MIN=INF;
        for(i=1;i<=n;i++)
            if(!viz[i]&&MIN>D[i]){
                MIN=D[i];
                k=i;
            }
        if(MIN!=INF){
            viz[k]=1;
            for(it=G[k].begin();it!=G[k].end();++it)
                if(!viz[it->first]&&D[it->first]>D[k]+it->second){
                    D[it->first]=D[k]+it->second;
                    t[it->first]=k;
                }
        }
        else ok=0;

    }
    for(i=1;i<=n;i++)
        if(i==p)
            ;
        else if(D[i]==INF)
            cout<<0<<' ';
        else
            cout<<D[i]<<' ';
}
void afisare(){
    vector< pair<int,int> >::iterator it;
    int i;
    for(i=1;i<=n;i++){
        for(it=G[i].begin();it!=G[i].end();++it)
            cout<<i<<' '<<it->first<<' '<<it->second<<'\n';
    }
}
int main(){
    citire();
    dijkstra();
    //afisare();
    return 0;
}
*/
#include <cstdio>

const int maxn = 50001;
const int inf = 1 << 30;

FILE *in = fopen("dijkstra.in","r"), *out = fopen("dijkstra.out","w");

struct graf
{
    int nod, cost;
    graf *next;
};

int n, m;
graf *a[maxn];
int d[maxn], q[maxn];

void add(int where, int what, int cost)
{
    graf *q = new graf;
    q->nod = what;
    q->cost = cost;
    q->next = a[where];
    a[where] = q;
}

void read()
{
    fscanf(in, "%d %d", &n, &m);

    int x, y, z;
    for ( int i = 1; i <= m; ++i )
    {
        fscanf(in, "%d %d %d", &x, &y, &z);
        add(x, y, z);
    }
}

void dijkstra()
{
    for ( int i = 2; i <= n; ++i )
        d[i] = inf;

    int min, pmin = 0;
    for ( int i = 1; i <= n; ++i )
    {
        min = inf;

        for ( int j = 1; j <= n; ++j )
            if ( d[j] < min && !q[j] )
                min = d[j], pmin = j;

        q[pmin] = 1;

        graf *t = a[pmin];

        while ( t )
        {
            if ( d[ t->nod ] > d[pmin] + t->cost )
                d[ t->nod ] = d[pmin] + t->cost;

            t = t->next;
        }
    }
}

int main()
{
    read();
    dijkstra();

    for ( int i = 2; i <= n; ++i )
        fprintf(out, "%d ", d[i] == inf ? 0 : d[i]);
    fprintf(out, "\n");

    return 0;
}