Cod sursa(job #605291)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 27 iulie 2011 16:58:11
Problema Drumuri minime Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
# include <fstream>
# include <vector>
# include <set>
using namespace std;

vector <int> a[1501], b[1501];
int n, m, i, j, x, y, cost, dm[1501], sol[1501];
set < pair <int, int> > st;

void dijkstra ()
{
    st.insert (make_pair (1, 1));// cost, nod
    sol[1] = 1;
    dm[1] = 0;
    for (int i = 2; i <= n; ++i) dm[i] = 2000000000;
    for (; st.size () > 0; )
    {
        int cost = (*st.begin ()).first, nod = (*st.begin ()).second;
        vector <int> :: iterator it1, it2;
        st.erase ((*st.begin ()));
        for (it1 = a[nod].begin (), it2 = b[nod].begin (); it1 != a[nod].end (); ++it1, ++it2)
            if (dm[*it1] > cost * (*it2))
                dm[*it1] = cost * (*it2), sol[*it1] = sol[nod], st.insert (make_pair (dm[*it1], (*it1)));
            else
            if (dm[*it1] == cost * (*it2))
                sol[*it1] += sol[nod];
    }
}
int main ()
{
    ifstream f ("dmin.in");
    ofstream g ("dmin.out");

    f >> n >> m;
    for (i = 1; i <= m; ++i)
    {
        f >> x >> y >> cost;
        a[x].push_back (y);
        a[y].push_back (x);
        b[x].push_back (cost);
        b[y].push_back (cost);
    }

    dijkstra ();
    for (i = 2; i <= n; ++i)
        g << sol[i] << ' ';
    g << '\n';
    g.close ();
    return 0;
}