Cod sursa(job #321538)

Utilizator rayvianPricope Razvan rayvian Data 6 iunie 2009 16:48:20
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <map>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

#define INF 10000000
vector<map<int,int> > v;
int n,m;



int  D[50001];
bool S[50001];

void citire()
{
 	fstream f;
  f.open("dijkstra.in",ios::in);

 	f>>n>>m;

	v.resize(n+1);
  int x,y,cost;
  for(int i=1; i<=m; i++)
  {
  	f>>x>>y>>cost;
    v[x][y]=cost;
    v[y][x]=cost;
  }
  f.close();

  for(int i=1; i<=n; i++)
  	D[i]=INF;

  map<int,int>::iterator mp;
  for(mp=v[1].begin(); mp!=v[1].end(); mp++)
  	D[mp->first]=mp->second;
}



int alege_nod()
{
	int k=0;
  int d=INF;
  for(int i=1; i<=n; i++)
  	if(S[i]==false)
    	if(D[i]<d)
      {
      	d=D[i];
        k=i;
      }
  return k;
}


void dijkstra(int nod)
{
	S[nod]=true;
  int i;
  for(i=1; i<=n; i++)
  	if(nod!=i && nod!=1 && i!=1)
    {
    	int x=v[nod][i];
      if(x==0)
      	x=INF;
  	if( D[nod] + x < D[i])
    	D[i]=D[nod]+x;
    }

  int k=alege_nod();
  if(k!=0)
  	return dijkstra(k);
}

void Debug()
{
	cout<<endl<<"D: ";
  for(int i=1; i<=n; i++)
  	cout<<D[i]<<" ";
  cout<<endl;
  for(int i=1 ;i<=n; i++)
  	cout<<S[i]<<" ";
  cout<<endl;
}
int main()
{

	citire();
  S[1]=true;
  int k=alege_nod();

  dijkstra(k);

  //Debug();

	ofstream g("dijkstra.out");
  for(int i=2; i<=n; i++)
  	g<<D[i]<<" ";
	return 0;
}