Cod sursa(job #67299)

Utilizator peanutzAndrei Homorodean peanutz Data 23 iunie 2007 21:01:07
Problema Drumuri minime Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#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.000001
using namespace std;

vector<int> a[NMAX];
vector<double> d[NMAX];
int n, m;
int nr[NMAX];
double dmin[NMAX];
int uz[NMAX];

inline double abs(double a) { return (a < 0) ? -a : a;}

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;
    uz[1] = 1;
	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] ] &&  dmin[ a[pozmin][j] ] - min - d[pozmin][j] > eps)
                        dmin[ a[pozmin][j] ] = min + d[pozmin][j], nr[ a[pozmin][j] ] = nr[pozmin];

                 //else if(uz[ a[pozmin][j] ] && abs(dmin[ a[pozmin][j] ] - min - d[pozmin][j]) <= eps)
                   //   ++nr[ a[pozmin][j] ];

			     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;
}