Cod sursa(job #67283)

Utilizator peanutzAndrei Homorodean peanutz Data 23 iunie 2007 20:17:28
Problema Drumuri minime Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 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.00000000001
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(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(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;
}