Cod sursa(job #1110552)

Utilizator alex_ovidiunituAlex Ovidiu Nitu alex_ovidiunitu Data 18 februarie 2014 10:29:45
Problema Drumuri minime Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#define mod 104659
#define ERR 0.00001
using namespace std;
vector < pair<int,double> > v[1514];
int p[1514],n,m;
double d[1514],z;// d distante minime , p numar min de drumuri
void bellman_ford (int nod)
{
    int i,nodc;
    queue <int> q;
    q.push(nod);
    while (!q.empty())
    {
        nod=q.front();
        q.pop();
        for (i=0;i<v[nod].size();i++)
        {
            nodc=v[nod][i].first;
            if (nodc!=1)
            {

               if (d[nodc]==0 || (d[nodc]-d[nod]-v[nod][i].second)>ERR)
                {
                    d[nodc]=d[nod]+v[nod][i].second;
                    p[nodc]=p[nod];
                    q.push(nodc);
                }
                else
                {
                    if (fabs(d[nodc]-d[nod]-v[nod][i].second)<ERR )
                    {
                        p[nodc]=(p[nodc]+p[nod])%mod;
                        //q.push(nodc);
                    }
                }
            }
        }
    }


}
int main()
{
    int i,j,x,y;
    fstream f,g;
    f.open("dmin.in",ios::in);
    g.open("dmin.out",ios::out);
    f>>n>>m;
    for (i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        z=log(z);
        v[x].push_back(make_pair(y,z));
        v[y].push_back(make_pair(x,z));

    }
    p[1]=1;
    bellman_ford(1);
    for (i=2;i<=n;i++)
        g<<p[i]<<" ";
}