Cod sursa(job #735030)

Utilizator a08iAndrei Ionescu a08i Data 15 aprilie 2012 16:30:02
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<vector>
#include<iostream>
#include<cstdio>
#include<algorithm>

#define INF 10000

using namespace std;
typedef vector< vector< pair<int, int> > > Graph;

vector<int> dist;
vector<int> explored;

void print_graph(Graph &graph)
{
  for(int i=0; i<graph.size(); i++)
  {
    cout << i << ": ";
    for(int j=0; j<graph[i].size(); j++)
    {
      cout << graph[i][j].first << "(" << graph[i][j].second << ") ";
    }
    cout << endl;
  }
}

void dij(Graph &graph, int source)
{
  dist[source] = 0;
  int numexplored = 1; // source
  explored[source] = 1;

  while(numexplored < graph.size())
  {

    int minedge = 0;
    int mincost = INF;
    int edgecost = 0;

    for(int i=1; i<graph.size(); i++)
    {
      if(explored[i] == 1) // search nodes outgoing from explored set
      {
        for(int j=0; j<graph[i].size(); j++)
        {
          if(explored[graph[i][j].first] == 0)
          {
            edgecost = dist[i] + graph[i][j].second;
            if(edgecost < mincost)
            {
              minedge = graph[i][j].first;
              mincost = edgecost;
            }
          }
        }
      }
    }

    explored[minedge] = 1;
    dist[minedge] = mincost;
    numexplored++;
  }

}

int main()
{
  freopen("dijkstra.in", "r", stdin);
  freopen("dijkstra.out", "w", stdout);

  int N, M, v1, v2, cost;
  scanf("%d %d", &N, &M);

  Graph graph(N+1, vector< pair<int,int> >());

  dist.resize(N+1, INF);
  explored.resize(N+1);

  for(int i=0; i<M; i++)
  {
    scanf("%d %d %d", &v1, &v2, &cost);
    graph[v1].push_back(make_pair(v2, cost));
  }

  dij(graph, 1);

  for(int i=2; i<=N; i++)
  {
    if(dist[i] == INF) dist[i] = 0;
    printf("%d ", dist[i]);
  }

  return 0;
}