Pagini recente » Cod sursa (job #957131) | Cod sursa (job #218705) | Cod sursa (job #177669) | Cod sursa (job #160278) | Cod sursa (job #67285)
Cod sursa(job #67285)
#include <stdio.h>
#include <vector>
#include <stdlib.h>
#include <math.h>
#define NMAX 1503
#define ps push_back
#define sz size()
#define INFI 2000000000
#define eps 0.000000001
using namespace std;
vector<int> a[NMAX];
vector<double> d[NMAX];
int n, m;
int nr[NMAX];
double dmin[NMAX];
int uz[NMAX];
void read()
{
int i;
int x, y;
double z;
scanf("%d %d", &n, &m);
for(i = 0; i < m; ++i)
{
scanf("%d %d %lf", &x, &y, &z);
z = log(z);
a[x].ps(y);
d[x].ps(z);
a[y].ps(x);
d[y].ps(z);
}
for(i = 1; i <= n; ++i)
dmin[i] = INFI;
for(i = 0; i < a[1].sz; ++i)
{
dmin[ a[1][i] ] = d[1][i];
nr[ a[1][i] ] = 1;
//printf("i = %d dmin = %lf\n", a[1][i], dmin[ a[1][i] ]);
}
}
void solve()
{
int i, j, pozmin;
double min;
for(i = 1; i < n; ++i)
{
for(j = 2, min = INFI; j <= n; ++j)
if(!uz[j] && min - dmin[j] >= eps)
min = dmin[j], pozmin = j;
//printf("pozmin: %d\n", pozmin);
for(j = 0, ++uz[pozmin]; j < a[pozmin].sz; ++j)
if(!uz[ a[pozmin][j] ])
{
if(min + d[pozmin][j] - dmin[ a[pozmin][j] ] >= eps)
dmin[ a[pozmin][j] ] = min + d[pozmin][j], nr[ a[pozmin][j] ] = nr[pozmin];
else if(abs(dmin[ a[pozmin][j] ] - min - d[pozmin][j]) <= eps)
nr[ a[pozmin][j] ] += nr[pozmin];
}
/*
for(int k = 2; k <= n; ++k)
printf("%d ", uz[k]);
printf("\n");
for(int k = 2; k <= n; ++k)
printf("%.2lf ", dmin[k]);
printf("\n");
for(int k = 2; k <= n; ++k)
printf("%d ", nr[k]);
printf("\n");
*/
}
}
int main()
{
freopen("dmin.in", "r", stdin);
freopen("dmin.out", "w", stdout);
read();
solve();
for(int i = 2; i <= n; ++i)
printf("%d ", nr[i]);
printf("\n");
return 0;
}