Cod sursa(job #501417)

Utilizator nautilusCohal Alexandru nautilus Data 14 noiembrie 2010 22:38:31
Problema Drumuri minime Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<fstream>
#include<cmath>
#include<vector>
#include<queue>

#define dmax 1510
#define inf 999999
#define EPS 1e-9
using namespace std;

int n,m;
vector<int> a[dmax], c[dmax];
double d[dmax];
int nrdr[dmax];
queue<int> q;

void citire()
{
 int i,x,y,z;
 
 ifstream fin("dmin.in");
 fin>>n>>m;
 for (i=1; i<=m; i++)
	 {
	  fin>>x>>y>>z;
	  a[x].push_back(y); c[x].push_back(z);
	  a[y].push_back(x); c[y].push_back(z);
	 }
 
 fin.close();
}


void solve()
{
 int i,elem;
 double log1,log2,log3;
 
 for (i=2; i<=n; i++)
	 d[i]=inf;
 d[1]=0; nrdr[1]=1;
 
 q.push(1); 
 
 while (q.size())
	 {
	  elem=q.front();
	  for (i=0; i<a[elem].size(); i++)
		  {
		   log1=d[a[elem][i]]; 
		   log2=d[elem]; 
		   log3=log ((double)c[elem][i]);
		   /*if (d[a[elem][i]] > d[elem] * c[elem][i])*/
		   if (log1 - (log2 + log3) > EPS)
			  {
			   /*d[a[elem][i]] = d[elem] * c[elem][i];*/
			   d[a[elem][i]] = log2 + log3;
			   nrdr[a[elem][i]] = nrdr[elem];
			   q.push(a[elem][i]);
			  } else
			  /*if (d[a[elem][i]] == d[elem] * c[elem][i])*/
			  if (abs(log1 - (log2 + log3)) <= EPS)
				 {
				  nrdr[a[elem][i]] += nrdr[elem];
				  if (q.back() != a[elem][i])
					  q.push(a[elem][i]);
				 }
		  }
	  q.pop();
	 }
}


void afisare()
{
 int i;
	
 ofstream fout("dmin.out");
 for (i=2; i<=n; i++)
	 fout<<nrdr[i]<<" ";
 
 fout.close();
}

int main()
{
	
 citire();
 solve();
 afisare();
	
 return 0;
}