Pagini recente » Cod sursa (job #2388844) | Cod sursa (job #1758802) | Cod sursa (job #1758124) | Cod sursa (job #18963) | Cod sursa (job #1699106)
#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;
}