Cod sursa(job #1360952)

Utilizator LucacelRazvanLucacel Razvan LucacelRazvan Data 25 februarie 2015 18:55:51
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#define Dmax 50010
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

int n,m,start;
int D[Dmax];
bool Seen[Dmax]; // vizitari

struct Muchie
{
    int j; // urm nod
    int c; // cost
};

vector <Muchie> Lista[Dmax];

/*struct cmp
{
    bool operator() (int &a, int &b)
    {
        return D[a] > D[b];
    }
};

priority_queue<int, vector<int>, cmp> q;*/
queue <int> q;

void Citire()
{
    int i,x;
    Muchie e;
    start=1; // incepem din nod 1, in acest caz

    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>e.j>>e.c;
        Lista[x].push_back(e);
    }

    for(i=1;i<=n;i++) // initializare distante
        if(i!=start) D[i] = (1<<30);
}

void Dijkstra(int s)
{
    vector <Muchie> :: iterator it;
    int u;
    q.push(s);
    Seen[s]=true;
    while(!q.empty())
    {
        //u=q.top();
        u=q.front();
        q.pop();
        Seen[u]=false;
        for(it=Lista[u].begin();it!=Lista[u].end();it++)
        {
            if( D[u] + it->c < D[it->j] )
            {
                D[it->j] = D[u] + it->c;
                if(Seen[it->j]==false)
                {
                    q.push(it->j);
                    Seen[it->j]=true;
                }
            }
        }
    }
}

int main()
{
    Citire();
    Dijkstra(start);

    for(int i=1;i<=n;i++) // afisare
    {
        if(i!=start)
        if(D[i] == (1<<30)) fout<<"0"<<" ";
            else fout<<D[i]<<" ";
    }
}