Cod sursa(job #484375)

Utilizator andra23Laura Draghici andra23 Data 13 septembrie 2010 22:58:08
Problema Drumuri minime Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#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].clear();
                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;
}