Cod sursa(job #1609240)

Utilizator GeorgianBaditaBadita Marin-Georgian GeorgianBadita Data 22 februarie 2016 18:03:57
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <cstdio>
#include <deque>
#include <vector>
#define NMAX 50005
#define pb push_back
#define INF 2*1e9
using namespace std;

FILE *f = freopen("dijkstra.in", "r", stdin);
FILE *g = freopen("dijkstra.out", "w", stdout);

class vecin{
public:
    int y, cost;
    vecin(int y, int cost)
    {
        this -> y = y;
        this -> cost = cost;
    }

};
vector <vecin> G[NMAX];
deque <int> Q;
int catune[NMAX], Dist[NMAX];
bool inqueue[NMAX];
int N, M, K;
/*void read()
{
    scanf("%d%d%d", &N, &M, &K);
    for(int i = 1; i<=M; i++)
    {
        int x, y, dist;
        scanf("%d%d%d", &x, &y, &dist);
        G[x].pb(vecin(y, dist));
        G[y].pb(vecin(x, dist));
    }
    for(int i = 1; i<=K; i++)
        scanf("%d", &Dist[i]);
}*/
void read()
{
    scanf("%d%d", &N, &M);
    for(int i = 1; i<=M; i++)
    {
        int x, y, dist;
        scanf("%d%d%d", &x, &y, &dist);
        G[x].pb(vecin(y, dist));
        G[y].pb(vecin(x, dist));
    }
    for(int i = 1; i<=K; i++)
        scanf("%d", &Dist[i]);
}
void bellman(int start)
{
    for(int i = 1; i<=N; i++)
        Dist[i] = INF;
    Q.pb(start);
    vector <vecin> ::iterator  it;
    inqueue[start] = true;
    Dist[start] = 0;
    while(!Q.empty())
    {
        int node = Q.front();
        Q.pop_front();
        inqueue[node] = false;
        for(it = G[node].begin(); it != G[node].end(); it++)
            if(Dist[node] + it -> cost < Dist[it -> y])
            {
                Dist[it -> y] = Dist[node] + it -> cost;
                if(!inqueue[it -> y]) {
                Q.pb(it -> y);
                inqueue[it -> y] = true;
                }
            }
    }
}
int main()
{
    read();
    bellman(1);
    vector <vecin> ::iterator x;
    /*for(int i = 1; i<=N; i++)
    {
       for(x = G[i].begin(); x != G[i].end(); x++)
            printf("%d ", x -> y);
       printf("\n");
    }*/

    for (int i = 2; i <= N; ++i)
        printf("%d ",( Dist[i] < INF ? Dist[i] :0));
    return 0;
}