Pagini recente » Cod sursa (job #296561) | Cod sursa (job #3041117) | Cod sursa (job #2725498) | Borderou de evaluare (job #1569505) | Cod sursa (job #2842755)
#include <iostream>
#include <fstream>
#include <cmath>
#include <queue>
using namespace std;
const int NMAX = 1501,
MOD = 104659;
const double EPS = 1e-9,
INF = 1e+9;
struct muchie
{
int y;
double w;
};
int N, M;
double D[NMAX]; ///D[i]=dist minima de la nodul src la i
int nrD[NMAX]; ///nrD[i]=numarul de drumuri de lungime D[i]
vector<muchie> G[NMAX];
queue<int>Q;
bool inQ[NMAX]; ///inQ[i] == 1 <==> nodul i este in coada
ifstream f("dmin.in");
ofstream g("dmin.out");
void citire()
{
int x, y, c;
double w;
f >> N >> M;
while(M--)
{
f >> x >> y >> c;
w = log(c);
G[x].push_back({y, w});
G[y].push_back({x, w});
}
}
void init(int src)
{
for(int i = 1; i <= N; ++i)
D[i] = INF;
D[src] = 0;
}
void BellmanFord(int src)
{
int crt, dest;
double cost;
init(src);
Q.push(src);
inQ[src] = 1;
nrD[src] = 1;
while(!Q.empty())
{
crt = Q.front();
Q.pop();
inQ[crt] = 0;
for(muchie &m : G[crt])
{
cost = D[crt] + m.w;
dest = m.y;
if(fabs(cost - D[dest]) <= EPS)
nrD[dest] = (nrD[dest] + nrD[crt]) % MOD;
else
if(D[dest] - cost > EPS)
{
D[dest] = cost;
nrD[dest] = nrD[crt];
if(inQ[dest] == 0)
{
Q.push(dest);
inQ[dest] = 1;
}
}
}
}
}
int main()
{
citire();
BellmanFord(1);
for(int i = 2; i <= N; ++i)
g << nrD[i] << ' ';
return 0;
}