Cod sursa(job #1112152)

Utilizator SapientiaCHIRILA ADRIAN Sapientia Data 19 februarie 2014 14:53:09
Problema Drumuri minime Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#define E 0.0000000001
#define MOD 104659
#define Nmax 1505
#define MAX 2000000000
using namespace std;
vector<pair<int,double> >G[Nmax];
vector<pair<int,double> >::iterator it;
queue <int> C;
int n;
bool viz[Nmax];
int NR[Nmax];
double dmin[Nmax];
void reading(int &n)
{
    int k,m,x,y;
    freopen("dmin.in","r",stdin);
    freopen("dmin.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(k=1;k<=m;++k)
    {
        double cost;
        scanf("%d %d %lf",&x,&y,&cost);
        cost=log(cost);
        G[x].push_back(make_pair(y,cost));
        G[y].push_back(make_pair(x,cost));
    }
}
void disjktra()
{
     int i,x,y;
     for(i=1;i<=n;++i) {dmin[i]=MAX;NR[i]=0;viz[i]=0;}
     C.push(1);dmin[1]=0;NR[1]=1;viz[1]=1;
     while(!C.empty())
     {
         x=C.front();C.pop();viz[x]=0;
         for(it=G[x].begin();it!=G[x].end();++it)
       {

              double cost=it->second;
              y=it->first;
              if (E<dmin[y]-dmin[x]-cost)
              {
                  dmin[y]=dmin[x]+cost;
                  NR[y]=NR[x];
                  if (!viz[y]) {C.push(y);viz[y]=1;}
              }
              else
              {
                  if (E>fabs(dmin[x]+cost-dmin[y]))
                  {
                      NR[y]=NR[y]+NR[x];
                      if (NR[y]>=MOD) NR[y]-=MOD;
                  }
              }
       }
    }
}
void writte()
{
    int i;
    for(i=2;i<=n;++i) printf("%d ",NR[i]);
}
int main()
{
    reading(n);
    disjktra();
    writte();
    return 0;
}