Pagini recente » Cod sursa (job #1495698) | Cod sursa (job #293089) | Cod sursa (job #2926534) | Cod sursa (job #1054631) | Cod sursa (job #920740)
Cod sursa(job #920740)
#include<fstream>
#include<cmath>
#include<vector>
#include<set>
#include<utility>
#define f first
#define s second
#define NMAX 1510
#define INF 2500000000000.0
#define EPS 0.0000000001
using namespace std;
ifstream f("dmin.in");
ofstream g("dmin.out");
int n, m, nr[NMAX], vz[NMAX];
double d[NMAX];
struct muchie
{
int nod;
double cost;
};
vector<muchie> a[NMAX];
set< pair<double, int> > s;
void Citeste()
{
int i, x, y;
muchie r;
f>>n>>m;
for (i=1; i<=m; ++i)
{
f>>x>>y>>r.cost;
r.nod=y; a[x].push_back(r);
r.nod=x; a[y].push_back(r);
}
}
void Initializeaza()
{
int i;
for (i=1; i<=n; ++i) d[i]=INF;
d[1]=0.0; nr[1]=1;
s.insert( make_pair(0.0, 1) );
}
void Solve()
{
int i, gata;
double val;
muchie r;
pair<double, int> pr;
set<pair<double, int> > :: iterator is;
do
{
gata=0;
while (!s.empty() && !gata)
{
is=s.begin();
pr=*is;
if (!vz[pr.s]) gata=1;
s.erase(is);
}
if (gata)
{
vz[pr.s]=1;
for (i=0; i<a[pr.s].size(); ++i)
{
r=a[pr.s][i];
if (!vz[r.nod])
{
val=log(r.cost)+pr.f;
if (d[r.nod]-val>EPS)
{
d[r.nod]=val;
s.insert(make_pair(val, r.nod));
nr[r.nod]=nr[pr.s];
}
else
if (fabs(d[r.nod]-val)<EPS) nr[r.nod]+=nr[pr.s];
}
}
}
}while (gata);
for (i=2; i<=n; ++i) g<<nr[i]<<" ";
}
int main()
{
Citeste();
Initializeaza();
Solve();
f.close();
g.close();
return 0;
}