Cod sursa(job #1904640)

Utilizator miha1000Dica Mihai miha1000 Data 5 martie 2017 18:22:23
Problema Drumuri minime Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <queue>
#include <vector>
#include <fstream>
#define nmax 50005
#define inf 100000

using namespace std;

int cont[nmax];
priority_queue<pair<int,int> > Q;

vector <pair< int, int > > G[nmax];
long long dist[nmax];

void dijkstra(pair<int,int> start){
    Q.push(start);
    int nod,cost,i;
    while(!Q.empty()){
        nod=Q.top().second;
        cost=Q.top().first;
        Q.pop();
        for(i=0;i<G[nod].size();i++){
            if (dist[G[nod][i].second]==-cost*G[nod][i].first) cont[G[nod][i].second]=(cont[G[nod][i].second]+cont[nod])%104659;
            else
            if(dist[G[nod][i].second]>-cost*G[nod][i].first) {
                dist[G[nod][i].second]=-cost*G[nod][i].first;
                Q.push(make_pair(-dist[G[nod][i].second],G[nod][i].second));
                cont[G[nod][i].second]=cont[nod]%104659;
            }
        }
    }
}
using namespace std;

int main()
{
    ifstream f("dmin.in");
    ofstream g("dmin.out");
    int n,m,i,x,y,c;
    f >> n >> m;
    for(i=2;i<=n;i++){
        dist[i]=inf;
    }
    for(i=1;i<=m;i++){
        f >> x >> y >> c;
        G[x].push_back(make_pair(c,y));
        G[y].push_back(make_pair(c,x));
    }
    cont[1]=1;
    dist[1]=0;

    pair <int,int > start;
    start=make_pair(-1,1);
    dijkstra(start);
    for(i=2;i<=n;i++){
        g << cont[i] << " ";
    }
    for(i=2;i<=n;i++) cout << dist[i] << " ";
}