Cod sursa(job #937200)

Utilizator Pcosmin93Posteuca Cosmin Pcosmin93 Data 9 aprilie 2013 23:05:36
Problema Algoritmul lui Dijkstra Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include<iostream>
#include<fstream>
#include<vector>

#define INFINIT 64000
#define MAX 50000

using namespace std;

struct nod{
    int cost,nr;
};

ifstream in("dijkstra.in");
ofstream out("dijkstra.out");

vector < pair < int , int > > graf[MAX];

void dijkstra(int inceput,int n){

    unsigned int length[n],it;
    int viz[n],B,C,exit=0,minim,poz,i,k=1;
    nod parcurgere[n];


    for( i = 1 ; i <= n ; i++ ){
        length[i]=INFINIT;
        viz[i]=0;
    }

    viz[inceput]=1;
    length[inceput]=0;

    for( it =0 ; it < graf[inceput].size() ; it++ ){

        B=graf[inceput][it].first;
        C=graf[inceput][it].second;
        length[B]=C;
        parcurgere[k].nr=B;
        parcurgere[k].cost=C;
        k++;

    }

    while(exit==0){

        minim=INFINIT;
        poz=0;

        for( i = 1 ; i < k ; i++ )
            if(inceput!=parcurgere[i].nr)
                if(parcurgere[i].cost<minim)
                    if(viz[parcurgere[i].nr]==0){

                        minim=parcurgere[i].cost;
                        poz=parcurgere[i].nr;

                    }
        if(poz==0)
            exit=1;
        else{

            viz[poz]=1;
            if(length[poz]==INFINIT)
                exit=1;
            else
                for( it = 0 ; it < graf[poz].size() ; it++ ){

                    B=graf[poz][it].first;
                    C=graf[poz][it].second;
                    if(length[poz]+C<length[B]){

                        parcurgere[k].nr=B;
                        length[B]=length[poz]+C;
                        parcurgere[k].cost=length[B];
                        k++;

                    }

                }
        }

    }
    for( i = 2 ; i <= n ; i++ ){

        if(length[i]==INFINIT)
            length[i]=0;
        if(inceput!=i)
            out<<length[i]<<" ";

    }

}

int main(){
    int A,B,C,n,m;

    in>>n>>m;
    for( int j = 1 ; j <= m ; j++ ){

            in>>A>>B>>C;
            graf[A].push_back(make_pair(B, C));

        }

    dijkstra(1,n);
    return 0;
}