Cod sursa(job #1227598)

Utilizator sebinechitasebi nechita sebinechita Data 10 septembrie 2014 21:24:48
Problema Drumuri minime Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <cmath>
#include <vector>
using namespace std;

ifstream fin("dmin.in");
ofstream fout("dmin.out");
#define MAX 1502
#define mp make_pair
#define pb push_back
#define eps 1e-10
#define MOD 104659
#define d (double)
typedef vector<pair<int, double> > :: iterator iter;
vector<pair<int, double> > G[MAX];
priority_queue <pair<double, int> > H;
double c, dist[MAX];
int val[MAX];
int viz[MAX];
int main()
{
    int n, m, x, y, nod, i;
    fin>>n>>m;
    while(m--)
    {
        fin>>x>>y>>c;
        c=d log10(c);
        G[x].pb(mp(y,d c));
        G[y].pb(mp(x,d c));
    }
    H.push(mp(0, 1));
    val[1]=1;
    for(i=2;i<=n;i++)
        dist[i]=1<<30;
    while(H.size())
    {
        nod=H.top().second;
        H.pop();
        if(viz[nod])
            continue;
        viz[nod]=1;
        for(iter it=G[nod].begin();it!=G[nod].end();it++)
        {
            if(abs(d dist[nod] +d it->second - d dist[it->first] )<=d eps)
            {
                val[it->first]+=val[nod];
                val[it->first]%=MOD;
            }
            else if((d dist[nod]+d it->second)<d dist[it->first])
            {
                dist[it->first]=(dist[nod]+it->second);
                val[it->first]=val[nod]%MOD;
                H.push(mp(-dist[it->first], it->first));
            }
        }
    }
    for(i=2;i<=n;i++)
    {
        fout<<val[i]<<" ";
    }
}