Cod sursa(job #265628)

Utilizator rayvianPricope Razvan rayvian Data 24 februarie 2009 10:14:59
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
void citire();
void afisare();
#include <iostream>
#include <fstream>
using namespace std;
int  v[50000][50000];
int  noduri;

int sel[50000];
int par[50000];
int dist[50000];


int ramase;


void dijkstra(int nod)
{
	sel[nod]=true;
	ramase--;
	//daca nu a fost selectat, exista drum de la nod la i si dista
	int DM=0;
	int NOD=0;
	do
	{
		DM=0;
		NOD=0;	
		for(int i=1; i<=noduri; i++)
			if(sel[i]==false && v[nod][i] && (dist[i]>dist[nod]+v[nod][i] || dist[i]==0) )
			{
				dist[i]=dist[nod]+v[nod][i];
				par[i]=nod;
				
				if( (DM>dist[i]) || DM==0)
				{
					DM=dist[i];
					NOD=i;
				}
			}
			else if(sel[i]==false && v[nod][i] && (DM>dist[i] || DM==0) )
			{
				DM=dist[i];
				NOD=i;
			}
		
		if(NOD!=0)
			dijkstra(NOD);
	}while( NOD!=0 && ramase!=0);
}


int main()
{
	
	citire();
	ramase=noduri;
	dijkstra(1);
	
	afisare();
	
	/*cin.sync();
	cin.get();*/
  return 0;
}


void afisare()
{
	fstream f;
	f.open("dijkstra.out",ios::out);
		for(int i=2; i<=noduri; i++)
			f<<dist[i]<<" ";
	f.close();
	/*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]<<" ";*/
}

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();
}