Cod sursa(job #880236)

Utilizator PatrikStepan Patrik Patrik Data 16 februarie 2013 15:16:04
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
    #include<cstdio>
    #include<fstream>
    #include<vector>
    #include<set>
    #define INF 50000002
    #define MAX 50001
    #define pb push_back
    using namespace std;
    int n , m  , d[MAX];
    bool inq[MAX];
    vector<int> g[MAX] , c[MAX];
    vector<int>::iterator it,it1;

    struct Compar{
    bool operator()(int i , int j)
    {
        return d[i] < d[j];
    }
    };

    multiset<int , Compar> Q;

    void citire();
    void dijkstra();
    void tipar();

    int main()
    {
        citire();
        dijkstra();
        tipar();
        return 0;
    }

    void citire()
    {
        int x,y,cost;
        ifstream f("dijkstra.in");
        f>>n>>m;
        for( int i = 1 ; i <= m ; ++i )
        {
            f>>x>>y>>cost;
            g[x].pb(y);
            c[x].pb(cost);
        }
    }

    void dijkstra()
    {
        int k;
        for(int i = 1 ; i<= n ; ++i )d[i] = INF;
        d[1] = 0;
        Q.insert(1);
        while(!Q.empty())
        {
            k = *Q.begin();
            Q.erase(Q.begin());
            inq[k] = 0;
            for( it = g[k].begin(), it1 = c[k].begin() ; it < g[k].end() ; it++ , it1++)
            {
                if(d[*it] > d[k] + *it1)
                {
                    d[*it] = d[k] + *it1;
                    inq[*it] = 1;
                    Q.insert(*it);
                }
            }

        }
    }

    void tipar()
    {
        freopen("dijkstra.out" , "w" , stdout );

        for( int i = 2 ; i<= n ; ++i )
        {
            if(d[i] == INF)
                printf("0 ");
            else
                printf("%d " , d[i]);
        }
    }