Pagini recente » Cod sursa (job #1954616) | Cod sursa (job #2605742) | Cod sursa (job #2913709) | Cod sursa (job #840134) | Cod sursa (job #484369)
Cod sursa(job #484369)
#include<fstream>
#include<vector>
#include<math.h>
#define maxn 1505
#define lmax 100000
#define r 104659
using namespace std;
vector< pair<int,double> > v[maxn];
vector<int> lant[maxn];
int h[maxn], pos[maxn], n, num[maxn];
double a[maxn], eps = 0.0000001;
ofstream g("dmin.out");
void up(int k){
int x = h[k];
while (k > 1 && (a[h[k/2]] - a[x]) > eps) {
h[k] = h[k/2];
pos[h[k]] = k;
k = k/2;
}
h[k] = x;
pos[x] = k;
}
void down(int k){
int son = 1, aux;
while (son != 0){
son = 0;
if (k*2 <= n){
son = k*2;
if (k*2+1 <= n && a[h[k*2]] - a[h[k*2+1]] > eps)
son = k*2+1;
if (son != 0 && a[h[son]] - a[h[k]] > eps)
son = 0;
}
if (son != 0){
aux = h[son];
h[son] = h[k];
h[k] = aux;
pos[h[k]] = k;
pos[h[son]] = son;
k = son;
}
}
}
void dfs(int nod){
int nr = 0;
for (int i = 0; i < lant[nod].size(); i++){
if (num[lant[nod][i]] == 0)
dfs(num[lant[nod][i]]);
nr = (nr+num[lant[nod][i]])%r;
}
num[nod] = nr;
}
int main(){
ifstream f("dmin.in");
int m, i, j, nodm, dist, poz, k1;
pair<int, double> k;
f>>n>>m;
for (i = 1; i <= m; i++){
f>>j>>k1>>dist;
v[j].push_back(make_pair(k1, log(dist)));
v[k1].push_back(make_pair(j, log(dist)));
}
h[1] = 1;
a[1] = 0;
pos[1] = 1;
for (i = 2; i <= n; i++){
h[i] = i;
a[i] = lmax;
pos[i] = i;
}
int nr = n;
while (n > 0){
nodm = h[1];
h[1] = h[n];
n--;
down(1);
for (i = 0; i < v[nodm].size(); i++){
k = v[nodm][i];
if (a[k.first] - a[nodm] - k.second > eps){
a[k.first] = a[nodm] + k.second;
poz = pos[k.first];
up(poz);
lant[k.first].push_back(nodm);
}
else
if (fabs(a[k.first] - a[nodm] - k.second) < eps)
lant[k.first].push_back(nodm);
}
}
num[1] = 1;
for (i = 2; i <= nr; i++)
if (num[i] == 0)
dfs(i);
for (i = 2; i <= nr; i++)
g<<num[i]<<" ";
return 0;
}