Cod sursa(job #1288626)

Utilizator thesvcoolmanLucian Bicsi thesvcoolman Data 8 decembrie 2014 22:29:56
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include<fstream>
#include<vector>
#include<deque>
#include<utility>
#include<iostream>

#define INF 99999
#define NMAX 50001

using namespace std;

ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

class Edge {
    public:
    int neighbor;
    int cost;
    Edge(int n, int c) {
        neighbor = n; cost = c;
        }
};

typedef vector<Edge> neighborList;
typedef neighborList Graph[NMAX];
typedef int Vertex;

Graph G; int nodes;

void citire() {
    int m, a, b, val;
    fin>>nodes>>m;
    //G.resize(nodes);
    for(int i=0;i<m;i++) {
        fin>>a>>b>>val;
        G[a-1].push_back(Edge(b-1, val));
        G[b-1].push_back(Edge(a-1, val));
    }
}

void afis(vector<int> v) {
    for(int i=0; i<v.size(); i++) {
        cout<<v[i]<<" ";
    }
    cout<<endl;
}
void afisgraf() {
    for(int i=0; i<nodes; i++) {
        cout<<i<<":  ";
        for(int j=0; j<G[i].size(); j++) {
        cout<<"("<<G[i][j].neighbor<<", "<<G[i][j].cost<<") ";
    }
    cout<<'\n';
    }
}


vector< int > bellman(int source) {
    deque<int> Q;
   // cout<<nodes;
    vector<int> dist (nodes, INF);

    //TODO: REMOVE
   // afis(dist);
   // afisgraf();

    dist[source] = 0;
   // cout<<dist.size();
    for(int i=0; i<G[source].size(); i++) {
        Q.push_back(G[source][i].neighbor);
        dist[G[source][i].neighbor] = G[source][i].cost;
    }

   // afis(dist);

    while(!Q.empty()) {
        int top = Q[0];
        Q.pop_front();
        for(int i=0; i<G[top].size(); i++) {
            Edge e = G[top][i];
            if(dist[e.neighbor] > dist[top] + e.cost) {
                dist[e.neighbor] = dist[top] + e.cost;
                Q.push_back(e.neighbor);
            }
        }
    }

    return dist;
}


int main() {

    citire();

    int source = 0;
    vector< int > sol(bellman(source));

    for(int i=1; i<nodes; i++) {
        fout<<sol[i]<<" ";
      // cout<<sol[i]<<" ";
    }

    fin.close();
    fout.close();

    return 0;
}