Cod sursa(job #608502)

Utilizator vendettaSalajan Razvan vendetta Data 16 august 2011 23:23:12
Problema Drumuri minime Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
//ATENTIUE LA CITIRE
#define nmax 1501
#define inf 0x3f3f

using namespace std;

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

vector<pair<int,int> > gf[nmax];
int n, m, viz[nmax], d[nmax], rez[nmax], t[nmax];

struct comp{
    bool operator () (const int &a, const int &b){
        return d[a]>d[b];
    }
};

void bf(){
    memset(d, inf, sizeof(d));
    priority_queue<int, vector<int>, comp> Q;
    //memset(rez,1,sizeof(rez));
    //for(int i=0;i<=n;i++) rez[i] = 1;
    d[1]=1;
    viz[1]=1;
    rez[1]=1;
    for(Q.push(1); !Q.empty();){
        int act = Q.top();
        viz[act] = 0;
        Q.pop();
        for(it i=gf[act].begin();i!=gf[act].end(); i++){
            int vecin = i->first;
            int cost = i->second;
            if (d[vecin] > d[act] * cost){
                d[vecin] = d[act] * cost;
                if (viz[vecin] == 0){
                    Q.push(vecin);
                    viz[vecin]=1;
                }
            }
            if (d[vecin] == d[act] * cost){
                rez[vecin]+=rez[act];
                if (viz[vecin] ==0){
                    Q.push(vecin);
                    viz[vecin] = 1;
                }
            }
        }
    }
}

void scrie_drum(int i){
    if (t[i]!=0) scrie_drum(t[i]);
    printf("%d ", i);
}

int main(){
    freopen("dmin.in","r",stdin);
    freopen("dmin.out","w",stdout);

    scanf("%d%d\n", &n, &m);

    for(int i=1; i<=m; i++){
        int x, y, c;
        scanf("%d%d%d\n", &x,&y,&c);
        gf[x].push_back(make_pair(y,c));
        gf[y].push_back(make_pair(x,c));
    }
    bf();

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