Cod sursa(job #1699106)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 6 mai 2016 06:01:05
Problema Drumuri minime Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <cstdio>
#include <cmath>
#include <vector>
#define nmax 1500
#include <queue>
#define inf 0x3f3f3f3f
#define mj 0.000000001

using namespace std;

int N,M,nrd[nmax];
double dist[nmax];
vector <pair<double,int> > G[nmax];
priority_queue <pair<double,int> > Q;
queue <int> Q2;

bool viz[nmax];

// deoarece variabilele sunt de tip double, daca diferenta dintre doua
// numere reale se incadreaza intr-o marja de eroare, atunci numerele sunt
// considerate egale
bool equal(double x,double y){
  return -mj <= x - y && x - y <= mj;
}

void Dijkstra(){

  int i,j;
  for(i = 2;i <= N;i++)dist[i] = inf;
  dist[1] = 0;
  
  Q.push(make_pair(0.00,1));
  while(!Q.empty()){

    i = Q.top().second;
    Q.pop();

    for(j = 0;j < G[i].size();j++){
      if(dist[G[i][j].second] > dist[i] + G[i][j].first){

	dist[G[i][j].second] = dist[i] + G[i][j].first;
	Q.push(make_pair(-dist[G[i][j].second],G[i][j].second));
	
      }
  
    }
    
  }
  
}

void BFS(){

  int i,x;
  Q2.push(1);
  viz[1] = 1;

  while(!Q2.empty()){

    x = Q2.front();
    Q2.pop();

    for(i = 0;i < G[x].size();i++){
      if(x == 1){
	nrd[G[x][i].second] = 1;
	if(viz[G[x][i].second] == 0){
	  Q2.push(G[x][i].second);
	  viz[G[x][i].second] = 1;
	}
	continue;
      }
      if(viz[G[x][i].second] == 0){
	if(equal(dist[G[x][i].second],dist[x] + G[x][i].first)){
	  nrd[G[x][i].second] = nrd[x];
	}
	viz[G[x][i].second] = 1;
	Q2.push(G[x][i].second);
      }
      else{
	if(equal(dist[G[x][i].second],dist[x] + G[x][i].first)){
	  nrd[G[x][i].second] += nrd[x];
	}
      }
    }
    
  }
  
}

int main(){

  freopen("dmin.in","r",stdin);
  freopen("dmin.out","w",stdout);

  scanf("%d %d ",&N,&M);
  int x,y;
  double z;
  while(M--){
    scanf("%d %d %lf ",&x,&y,&z);
    z = log(z);
    G[x].push_back(make_pair(z,y));
    G[y].push_back(make_pair(z,x));
  }

  Dijkstra();

  BFS();

  //for(x = 1;x <= N;x++)printf("%f ",dist[x]);
  //printf("\n");
  
  for(x = 2;x <= N;x++)printf("%d ",nrd[x]);
  printf("\n");
  
  return 0;
  
}