Cod sursa(job #610576)

Utilizator vendettaSalajan Razvan vendetta Data 28 august 2011 05:33:51
Problema Drumuri minime Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#define nmax 15001
#define inf 0x3f3f3f3f
using namespace std;

typedef vector<pair<int, int> >::iterator it;

int rez[nmax], n, m, d[nmax];
vector<pair<int, int> > gf[nmax];
multiset<pair<int,int> > heap;

void dijkstra(){
    memset(d, inf, sizeof(d));
    d[1]=1;
    rez[1]=1;
    heap.insert(make_pair(1,1));
    while(heap.size()){
        int min = (*heap.begin()).first;
        int nod = (*heap.begin()).second;
        heap.erase(*heap.begin());
        for(it i=gf[nod].begin(); i!=gf[nod].end(); i++){
            int vecin = i->first;
            int cost = i->second;
            if (d[vecin] == d[nod] * cost) rez[vecin]+= rez[nod];
            if (d[vecin] > d[nod] * cost){
                d[vecin] = d[nod] * cost;
                rez[vecin] = rez[nod];
                heap.insert(make_pair(d[vecin], vecin));
            }
        }
    }
}

int main(){
    freopen("dmin.in","r",stdin);
    freopen("dmin.out","w",stdout);
    scanf("%d %d", &n, &m);
    for(int i=1;i<=m;i++){
        int x,y,c;
        scanf("%d %d %d ", &x, &y, &c);
        gf[x].push_back(make_pair(y,c));
        gf[y].push_back(make_pair(x,c));
    }

    dijkstra();
    for(int i=2; i<=n; i++) printf("%d ", rez[i]);
    return 0;
}