Cod sursa(job #1885197)

Utilizator theodor1289Theodor Amariucai theodor1289 Data 19 februarie 2017 18:38:54
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>

#define infinit 9999999
#define nmax 110

#define IN "dijkstra.in"
#define OUT "dijkstra.out"

using namespace std;

ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

int M[nmax][nmax], n, p, D[nmax];

void dijkstra(int x0) 
{
	int i, k, ok, minim, viz[nmax];
	//initializez vectorul distantelor de la x0 la fiecare nod
	for (i = 1; i <= n; i++) 
    {
		D[i] = M[x0][i];
		viz[i] = 0;            //si marchez ca nevizitat nodul i
	}

	D[x0] = 0; viz[x0] = 1; ok = 1;  //plec de la nodul de start (x0)
	while (ok) 
    {
        //caut nodul nevizitat aflat la diatnta minima 
		minim = infinit;
		for (i = 1; i <= n; i++)
			if (!viz[i] && minim > D[i]) 
        	{
				minim = D[i];
				k = i;               //am gasit nodul i...il retin     
			}
        //daca am gasit un nod (minim != infinit)
		if (minim != infinit) 
        {
			viz[k] = 1;                 //il vizitez
			for (i = 1; i <= n; i++)    //actualizez distantele din D[] care trec prin k 
				if (!viz[i] && D[i]>D[k] + M[k][i]) //pentru nodurile nevizitate  
					D[i] = D[k] + M[k][i];
		}
		else 
            ok = 0;   //nu mai am nici un nod la care pot ajunge
	}
}

int main() 
{
	int i, j, x, y, v;
    //citesc numarul de noduri si nodul de la care calculez (nodul de start)
	fin >> n >> p;
    //initializez matricea costurilor 
	for (i = 1; i <= n; i++) 
    {
		for (j = 1; j <= n; j++)
			M[i][j] = infinit;
		M[i][i] = 0;
	}
    //citesc arcele si costurile pe arce
	while (fin >> x >> y >> v)
		M[x][y] = v;
    
	dijkstra(p);
	
    //afisare vectorul de distante
	for (i = 1; i <= n; i++)
		if (D[i] != infinit) 
        	fout << D[i] << ' ';
		else 
        	fout << "-1 ";
    fout << '\n';
	return 0;
}