Cod sursa(job #814726)

Utilizator sandu2508Grigoroi Alexandru sandu2508 Data 15 noiembrie 2012 22:22:39
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include <iostream>
#include <vector>
#include <set>
using namespace std;

#define maxV 50050
#define INF 1 << 30

int V;
vector< pair<int,int> > g[maxV];
int dist[maxV];
int prev[maxV];
int proc[maxV];
void shortestPath(int s) {
  set< pair<int,int> > Q;
  for(int i = 0; i < V; i++)
    dist[i] = INF;
  dist[s] = 0;
  for(int i = 0; i < V; i++)
    Q.insert(make_pair(dist[i], i));

  while(Q.size() > 0)
  {

    int v = (*Q.begin()).second;
    if(dist[v] >= INF) break;
    Q.erase(*Q.begin());
    for(int i = 0; i < g[v].size(); i++)
    {
      int w = g[v][i].second;
      int x = g[v][i].first;
      if(dist[x] > dist[v] + w){
        Q.erase(Q.find(make_pair(dist[x],x)));
        dist[x] = dist[v] + w;
        Q.insert(make_pair(dist[x], x));
        prev[x] = v;
      }
    }
  }
}

int main()
{
  int m;
  int tea, teb, tec;
  cin>>V>>m;
  for(int i=0;i<m;i++)
  {
    cin>>tea>>teb>>tec;
    g[tea].push_back(make_pair(teb, tec));
    g[teb].push_back(make_pair(tea, tec));
  }
  V++;
  shortestPath(1);
  for(int i=2;i<V;i++)
    cout<<dist[i]<<' ';
  cout<<"\n";
}
    //   }
    // prev.assign(n, -1);
    // int mini=0;
    //  // "e < f" <=> "e.weight > f.weight"
    // for (prev[dest] == -1) {
    //   for(int i=1;i<V;i++)
    //     if((dist[i]<dist[mini])&&(prev[i] == -1))
    //       mini=i;
    //   for(int i=0;i<g[mini].size();i++)
    //   {
    //     if(dist[g[mini].])
    //   }
    //     Edge e = Q.front(); Q.pop();
    //     if (prev[e.dst] != -1)
    //         continue;
    //     prev[e.dst] = e.src;
    //     for(int i = 0; i < g[e.dst].size(); i++)
    //     {
    //       int v = g[e.dst][i].first;
    //       int w = g[e.dst][i].second;
    //       if(dist[v] > e.weight + w)
    //       {
    //         dist[v] = e.weight + w;
    //         Q.push(Edge(e.dst, v, w + e.weight))
    //        }
    //     }
    //     FOR(f,g[e.dst]) {
    //         if (dist[f->dst] > e.weight+f->weight) {
    //             dist[f->dst] = e.weight+f->weight;
    //             Q.push(Edge(f->src, f->dst, e.weight+f->weight));
    //         }
    //     }
    // }
/*vector<int> buildPath(const vector<int> &prev, int t) {
    vector<int> path;
    for (int u = t; u >= 0; u = prev[u])
        path.push_back(u);
    reverse(path.begin(), path.end());
    return path;
}*/