Cod sursa(job #2207494)

Utilizator sandupetrascoPetrasco Sandu sandupetrasco Data 25 mai 2018 19:44:07
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <bits/stdc++.h>
#define PII pair < int , int >

using namespace std;

int pozr;
char buffer[1010];
FILE *fi, *fo;
             
char getch(){
    if( pozr == 1010 ){
        fread( buffer, 1010, 1, fi  );
        pozr = 0;
    }
    return buffer[ pozr++ ];
}
             
int scano(){
    int nr = 0, sign = 1;
    char ch = getch();
    while( isdigit(ch) == 0 && ch != '-'){
        ch = getch();
    }

    if (ch == '-'){
        sign = -1;
        ch = getch();
    }

    while( isdigit(ch) != 0 ){
        nr = nr * 10 + ch - '0';
        ch = getch();
    }

    return nr * sign;
}

int n, m, apm, dad[200005], dist[200005];
vector < PII > V[200005];
set < PII > S;
bitset < 200005 > B;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    fi = fopen("dijkstra.in", "r");
    fo = fopen("dijkstra.out", "w");
    n = scano(); m = scano();

    for (int i = 1; i <= n; i++) dist[i] = 2e9;

    for (int i = 1, x, y, z; i <= m; i++){
        x = scano();
        y = scano();
        z = scano();

        V[x].push_back({y, z});
        V[y].push_back({x, z});
    }

    S.insert({0, 1});
    dist[1] = 0;

    while (S.size()){
        int node = S.begin()->second;
        S.erase(S.begin());

        for (auto it : V[node]){
            int vertex = it.first;
            int weight = it.second;

            if (dist[node] + weight < dist[vertex]){
                if (dist[vertex] != 2e9)
                    S.erase(S.find({dist[vertex], vertex}));

                dist[vertex] = dist[node] + weight;
                dad[vertex] = node;
                S.insert({dist[vertex], vertex});
            }
        } 
    }

    for (int i = 2; i <= n; i++){
        fprintf(fo, "%d ", dist[i]);
    }

    return 0;
}