Pagini recente » Cod sursa (job #2073296) | Cod sursa (job #2080718)
#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();
}