Cod sursa(job #1978351)

Utilizator Eduard6421Eduard Gabriel Eduard6421 Data 7 mai 2017 15:44:05
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
#include<fstream>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>

#define INF 0x3f3f3f3f
#define NMAX 12000



using namespace std;


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

vector<pair<int,int> > v[NMAX];



int dist[NMAX];


struct comparator
{
    bool operator()   ( const pair<int,int>& left, const pair<int,int>& right) const
    {
        return left.first < right.first;
    }


};

set< pair<int,int>,comparator > edges;

set< pair<int,int> > ::iterator it;
set< pair<int,int> > ::iterator ij;




void read_data(int &n,int &m)
{

    int node1,node2,weight;

    int i;

    in >> n >> m;

    for( i = 0 ; i < m ; ++i)
    {
        in>>node1>>node2>>weight;

        v[node1].push_back(make_pair(weight,node2));
        v[node2].push_back(make_pair(weight,node1));

    }

}

void set_distances(int root, int n)
{
    int i;

    for(i = 1 ; i <= n ; ++i)
        dist[i] = INF;


    dist[root] = 0;

}

void Dijkstra(int  root, int n)
{
    pair<int,int> temp;

    int fiu,cost;

    int i;

    set_distances(root,n);



    edges.insert(make_pair(0,root));


    while(!edges.empty())
    {

        it = edges.begin();

        for( i = 0 ; i < v[(*it).second].size(); ++i)
        {

            fiu =  v[(*it).second][i].second;
            cost = (*it).first + v[(*it).second][i].first;

            if(dist[fiu] > cost)
            {
                dist[fiu ] = cost;

                temp = make_pair(cost,fiu);

                ij = edges.find(temp);

                if(ij == edges.end())
                    edges.insert(temp);
                else
                {
                    edges.erase(ij);
                    edges.insert(temp);

                }

            }


        }

        edges.erase(it);


    }


    for ( i = 2 ; i<=n ; ++i)
    {
        if(dist[i] == INF)
            out<<"0 ";
        else
            out<<dist[i]<<' ';


    }


    return ;

}





int main()
{

    int n,m;

    read_data(n,m);

    Dijkstra(1,n);



    return 0;



}