Cod sursa(job #1138661)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 10 martie 2014 13:39:48
Problema Drumuri minime Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <fstream>
#include <cmath>
#include <vector>
#include <algorithm>

using namespace std;

const int NMax = 1510, MMax = 2510, MOD = 104659, INF = 2000000000;
const double EPS = 1e-9;
bool viz[NMax];
struct NOD
{
    int node;
    double cost;
    NOD() {node = 0; cost = 0.0;}
    NOD(const int node, const double cost)
    {
        this -> node = node;
        this -> cost = cost;
    }
};
vector <NOD> G[NMax];
int n, m;
int ans[NMax];
double d[NMax];

void Read()
{
    ifstream f("dmin.in");
    f>>n>>m;
    for (int i = 1; i <= m; ++i)
    {
        int x, y;
        double cost;
        f>>x>>y>>cost;
        cost = log(cost);
        G[x].push_back(NOD(y, cost));
        G[y].push_back(NOD(x, cost));
    }
    f.close();
}

inline bool cmp(const int &x, const int &y)
{
    return d[x] > d[y];
}

void Solve()
{
    vector <int> Q;
    for (int i = 1; i <= n; ++i)
        d[i] = INF;
    d[1] = 0;
    ans[1] = 1;
    Q.push_back(1);
    while (!Q.empty())
    {
        int node = Q[0];
        viz[node] = false;
        pop_heap(Q.begin(), Q.end(), cmp);
        Q.pop_back();
        for (vector <NOD> :: iterator it = G[node].begin(); it!=G[node].end(); ++it)
        {
            NOD aux = *it;
            if (d[aux.node] - d[node] - aux.cost > EPS)
            {
                d[aux.node] = d[node] + aux.cost;
                ans[aux.node] = ans[node];
                ans[aux.node] = ans[aux.node] >= MOD ? ans[aux.node] - MOD : ans[aux.node];
                if (!viz[aux.node])
                {
                    viz[aux.node] = true;
                    Q.push_back(aux.node);
                    push_heap(Q.begin(), Q.end(), cmp);
                }
            }
            else if (fabs(d[aux.node] - d[node] - aux.cost) <= EPS) /// is egale
            {
                ans[aux.node] += ans[node];
                ans[aux.node] = ans[aux.node] >= MOD ? ans[aux.node] - MOD : ans[aux.node];
            }
        }
    }
}

void Write()
{
    ofstream g("dmin.out");
    for (int i = 2; i<=n; ++i)
        g<<ans[i]<<" ";
    g<<"\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    Write();
    return 0;
}