Cod sursa(job #1771708)

Utilizator KronSabau Valeriu Kron Data 5 octombrie 2016 21:54:14
Problema Drumuri minime Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <iterator>
#include <functional>
#include <climits>
#include <cmath>
#define nmax 1510
#define MOD 104659
using namespace std;

ifstream f("dmin.in");
ofstream g("dmin.out");
vector <pair<double,int> > adj[nmax];
int n,m;
int best[nmax];
double err=1e-9,INF=1e+37;
struct cmp {
    bool operator()(pair<double,int> a,pair<double,int> b){
        return a.first>b.first;
    }
};
priority_queue <pair<double,int>,vector<pair<double,int> >,cmp> pb;
double dist[nmax];

void dijktras(int v)
{
    int u;
    double cost,b;
    dist[v]=0;
    pb.push(make_pair(0,v));
    while(!pb.empty())
    {
        v=pb.top().second;
        b=pb.top().first;
        pb.pop();
        for(vector<pair<double,int> >::iterator it=adj[v].begin();it!=adj[v].end();it++)
        {
            u=it->second;
            cost=it->first;
            b=cost+dist[v];
            if(fabs(dist[u]-b)<err){
                best[u]+=best[v];
                best[u]=best[u]%MOD;
            }
            else
                if(dist[u]-err>=dist[v]+cost)
                {
                    best[u]=best[v];
                    dist[u]=dist[v]+cost;
                    pb.push(make_pair(dist[u],u));
                }
        }
    }

}

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

    for(int i=1;i<=n;i++){
        dist[i]=INF;
    }

    best[1]=1;
    dijktras(1);

    for(int i=2;i<=n;i++)
        g << best[i] << " ";

    return 0;
}