Cod sursa(job #1875159)

Utilizator alexandruchiriacAlexandru Chiriac alexandruchiriac Data 10 februarie 2017 19:51:28
Problema Drumuri minime Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bits/stdc++.h>
using namespace std;

#define NRMAX 1501
#define pb push_back
#define mp make_pair
#define INF numeric_limits < int > ::max()
#define mod 104659

ifstream f("dmin.in");
ofstream g("dmin.out");

int n,m;
vector < pair < int , int > > G[NRMAX];
vector < int > used;
vector < int >  d;
vector < int >  drmin;


void read()
{
    f >> n >> m;
    used = vector < int > (n+1);
    d = vector < int > (n+1,INF);
    drmin = vector < int > (n+1,1);
    for ( ; m-- ; )
    {
        int x,y,z;
        f >> x >> y >> z;
        G[x].pb(mp(y,z));
        G[y].pb(mp(x,z));
    }
}

void bellman ( int i )
{
    queue < int > q;
    d[i] = 1;
    q.push(i);
    used[i] = 1;
    while ( !q.empty() )
    {
        int nod = q.front();
        q.pop();
        for ( vector < pair < int , int > > ::iterator j = G[nod].begin(); j != G[nod].end(); j++ )
        {
            int x = (*j).first;
            int cost = (*j).second;
            if ( d[x] > d[nod] * cost )
            {
                d[x] = d[nod] * cost;
                drmin[x] = drmin[nod];
                drmin[x] %= mod;
                if ( !used[x] )
                {
                    q.push(x);
                    used[x] = 1;
                }
            }
            else
                if ( d[x] == d[nod] * cost )
                {
                    drmin[x] += drmin[nod];
                    drmin[x] %= mod;
                }
        }
    }
    for ( i = 2; i <= n ; i++ )
        g << drmin[i]%mod << " ";
}

int main()
{
    read();
    bellman(1);
    return 0;
}