Cod sursa(job #1576748)

Utilizator sicsicFMI-Coteanu Vlad sicsic Data 22 ianuarie 2016 19:59:42
Problema Drumuri minime Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<fstream>
#include<string.h>
#include<math.h>
using namespace std;
#define Nmax 1507
#define MOD 104659
#define INF 99999999
#define eps 1e-15
ifstream f("dmin.in");
ofstream g("dmin.out");
int N,M,Nr[Nmax];
long double D[Nmax];
bool U[Nmax];
struct lista{int nod; long double cost; lista *leg;} *G[Nmax];
void adaug(int i,int j,float c)
{
    lista *p;
    p=new lista;
    p->nod=j;
    p->leg=G[i];
    p->cost=c;
    G[i]=p;
}
void citire()
{
    f>>N>>M;
    int i,j,c;
    while(M--)
    {
        f>>i>>j>>c;
        adaug(i,j,log10l(c));
        adaug(j,i,log10l(c));
    }
}
void Dyj(int source)
{
    for(int i=1;i<=N;++i) D[i]=INF;
    int mini,nod,poz;
    D[source]=0;
    while(1)
    {
        mini=INF;
        for(int i=1;i<=N;++i) if(!U[i]&&-D[i]+mini>eps) mini=D[i],poz=i;
        if(mini==INF) break;
        nod=poz; U[nod]=1; Nr[1]=1;
        for(lista *p=G[nod];p;p=p->leg)
            {
                long double x=D[nod]+p->cost;
                if(D[p->nod]-(D[nod]+p->cost)>eps)
                {
                    D[p->nod]=D[nod]+p->cost;
                    Nr[p->nod]=Nr[nod];
                }
                else if(fabs(D[p->nod]-(D[nod]+p->cost))<=eps) Nr[p->nod]+=Nr[nod],Nr[p->nod]%=MOD;
            }
    }
}
int main()
{
    citire();
    Dyj(1);
    for(int i=2;i<=N;++i) g<<Nr[i]%MOD<<" ";
    g<<'\n';
    return 0;
}