Cod sursa(job #265954)

Utilizator rayvianPricope Razvan rayvian Data 24 februarie 2009 19:32:58
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
using namespace std;

int v[10000][10000];
int noduri;

int sel[10000];
int par[10000];
int dist[10000];

void citire();
void afisare();
void init();

const int inf=0x7fffffff/2;



int nod_nevizitat()
{
	int k=inf;
  int NOD;
  for(int i=2; i<=noduri; i++)
  	if( dist[i]<k &&  sel[i]==false )
    {
      k=dist[i];
      NOD=i;
    }
  if(k!=inf)
  	return NOD;
  return 0;
}


void dijkstra(int k)
{
	sel[k]=true;
	for(int i=2; i<=noduri; i++)
  	if(dist[i] > dist[k]+v[k][i])
    	dist[i]=dist[k]+v[k][i];

}

int main()
{
	citire();
  init();

  int k=nod_nevizitat();
	while(k)
  {
  	dijkstra(k);
    k=nod_nevizitat();
  }


	afisare();
  /*cin.sync();
  cin.get();*/
	return 0;
}


void init()
{
	for(int i=1; i<=noduri; i++)
		if(v[1][i]!=0)
			dist[i]=v[1][i];

}


void afisare()
{
	/*for(int i=1; i<=noduri; i++)
	{
		cout<<endl;
		for(int j=1; j<=noduri; j++)
			cout<<v[i][j]<<" ";
	}
	cout<<endl<<endl;
	for(int i=1; i<=noduri; i++)
		cout<<sel[i]<<" ";
	cout<<endl;
	for(int i=1; i<=noduri; i++)
		cout<<par[i]<<" ";
	cout<<endl;
	for(int i=1; i<=noduri; i++)
		cout<<dist[i]<<" ";*/

  fstream g;
  g.open("dijkstra.out",ios::out);

  for(int i=2; i<=noduri; i++)
  	if(dist[i]>=inf)
    	g<<"0 ";
    else
	  	g<<dist[i]<<" ";

  g.close();
}

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

	for(int i=1; i<=muchii; i++)
	{
		int x,y,z;
		f>>x>>y>>z;
		v[x][y]=z;
		v[y][x]=z;
	}
	f.close();

  for(int i=1; i<=noduri; i++)
  	for(int j=1; j<=noduri; j++)
    	if(i!=j && v[i][j]==0)
      	v[i][j]=inf;

}