Cod sursa(job #1661871)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 24 martie 2016 11:34:44
Problema Drumuri minime Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <iomanip>

#define NMax 1505
#define INF 0x3f3f3f3f
#define mod 104659
using namespace std;

int dist[NMax],ANS[NMax],viz[NMax];
int n,m,x,y,c;
vector<pair<int,double> > G[NMax];
queue<int> q;

void bf(){
    memset(dist,INF,sizeof(dist));

    dist[1] = 1;
    ANS[1] = 1;
    q.push(1);
    viz[1] = 1;
    while(!q.empty()){
        int nod = q.front();
        q.pop();
        for(int i = 0; i < G[nod].size(); ++i){
            if(dist[G[nod][i].first] == dist[nod] * G[nod][i].second && G[nod][i].first != 1){
                ANS[G[nod][i].first] = (ANS[G[nod][i].first] + ANS[nod] % mod) % mod;
            }
            if(dist[G[nod][i].first] > dist[nod] * G[nod][i].second){
                dist[G[nod][i].first] = dist[nod] *  G[nod][i].second;
                ANS[G[nod][i].first] = ANS[nod];
                if(viz[G[nod][i].first] == 0){
                    q.push(G[nod][i].first);
                    viz[G[nod][i].first] = 1;
                }
            }
        }
    }
    ofstream g("dmin.out");
    for(int i = 2; i <= n; ++i){
        g << ANS[i] % mod <<' ';
    }
    g.close();
}
int main()
{
    ifstream f("dmin.in");


    f >> n >> m;
    for(int i = 1; i <= m; ++i){
        f >> x >> y >> c;
        G[x].push_back(make_pair(y,log(c)));
        G[y].push_back(make_pair(x,log(c)));
    }

    bf();

    f.close();

    return 0;
}