Cod sursa(job #920740)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 20 martie 2013 16:51:46
Problema Drumuri minime Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include<fstream>
#include<cmath>
#include<vector>
#include<set>
#include<utility>
#define f first
#define s second
#define NMAX 1510
#define INF 2500000000000.0
#define EPS 0.0000000001

using namespace std;

ifstream f("dmin.in");
ofstream g("dmin.out");

int n, m, nr[NMAX], vz[NMAX];
double d[NMAX];

struct muchie
{
    int nod;
    double cost;
};

vector<muchie> a[NMAX];

set< pair<double, int> > s;

void Citeste()
{
    int i, x, y;
    muchie r;

    f>>n>>m;

    for (i=1; i<=m; ++i)
    {
        f>>x>>y>>r.cost;

        r.nod=y; a[x].push_back(r);
        r.nod=x; a[y].push_back(r);
    }
}

void Initializeaza()
{
    int i;

    for (i=1; i<=n; ++i) d[i]=INF;

    d[1]=0.0; nr[1]=1;

    s.insert( make_pair(0.0, 1) );
}

void Solve()
{
    int i, gata;
    double val;
    muchie r;
    pair<double, int> pr;
    set<pair<double, int> > :: iterator is;

    do
    {
        gata=0;

        while (!s.empty() && !gata)
        {
            is=s.begin();
            pr=*is;
            if (!vz[pr.s]) gata=1;
            s.erase(is);
        }

        if (gata)
        {
            vz[pr.s]=1;
            for (i=0; i<a[pr.s].size(); ++i)
            {
                r=a[pr.s][i];

                if (!vz[r.nod])
                {
                    val=log(r.cost)+pr.f;

                    if (d[r.nod]-val>EPS)
                    {
                        d[r.nod]=val;
                        s.insert(make_pair(val, r.nod));
                        nr[r.nod]=nr[pr.s];
                    }
                    else
                        if (fabs(d[r.nod]-val)<EPS) nr[r.nod]+=nr[pr.s];
                }
            }
        }

    }while (gata);

    for (i=2; i<=n; ++i) g<<nr[i]<<" ";
}

int main()
{
    Citeste();

    Initializeaza();

    Solve();

    f.close();
    g.close();
    return 0;
}