Cod sursa(job #2080718)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 3 decembrie 2017 14:27:16
Problema Drumuri minime Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include<iostream>
#include<fstream>
#include<cmath>
#include<vector>
#include<queue>
#define CL 104659
#define epsilon 1e-9
#define Dim 20000000.0
using namespace std;
ifstream fin("dmin.in");
ofstream fout("dmin.out");
int d[1600];
int n,m,per[1605];
vector < pair<int, int> > G[1605];

typedef struct cmpdst
{
    bool operator() (int x, int y)
    {
        return d[x]>d[y];
    }
};

priority_queue < pair< int,int >, vector< pair< int, int > >, greater < pair< int, int> > > q;

void citire()
{   int i,x,y,z;
    fin>>n>>m;
for (i=1;i<=m;i++)
{
    fin>>x>>y>>z;
    G[x].push_back(make_pair(y,log(z)));
    G[y].push_back(make_pair(x,log(z)));

}

}
int modul(int x)
{
    if(x>=0) return x;
    else return -x;
}
void dijkstra()
{
    int viz[1605],i;
    for(i=1;i<=n;i++) d[i]=Dim;
    d[1]=0;
    int aux,bc;
    q.push(make_pair(1,d[1]));
    per[1]=1;
    while(!q.empty())
    {
        aux=q.top().first;
        q.pop();
        if(!viz[aux])
        {
            viz[aux]=1;
            for( i=0;i<G[aux].size();i++)
            {
                int urm=G[aux][i].first;
                int cost=G[aux][i].second;
                if(modul(d[urm]-(d[aux]+cost)) < epsilon) per[urm]=per[urm]+per[aux];
                else if(d[urm]>d[aux]+cost)
                {
                    d[urm]=d[aux]+cost;
                    per[urm]=per[aux];
                    if(viz[urm]==0) q.push(make_pair(urm,d[urm]));
                }

            }
        }
    }
}

void afisare()
{
  int i;
    for(i=2;i<=n;i++)
        fout<<per[i]<<' ';
}
int main()
{
    citire();
    dijkstra();
    afisare();

}