Cod sursa(job #1095819)

Utilizator dragos-giidragos ghinoiu dragos-gii Data 31 ianuarie 2014 22:48:04
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <fstream>
#include <iostream>
#define infinity 63366

using namespace std;

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

int A[100][100], cost[100][100], visited[100], dist[100], n, previous[100];

struct element{
	int nod;
	element* next;
}*prim;

void addr(int x){
	
	element *p;
	
	p = new element;
	
	p -> nod = x;
	p -> next = NULL;
	
	if(prim == NULL)
		prim = p;
	
	else {
		element* q = prim;
		
		while(q -> next != NULL)
			q = q -> next;
		
		q -> next = p;
	}
}

void deletenod(int v) {
	
	element* p;
	
	p = prim;
	
	if(p -> nod == v){
		prim = NULL;
		delete p;
	}
	
	else {
		
	while (p -> nod != v)
		p = p -> next;
	
	element* q;
	
	q = prim;
	
	while (q -> next != p)
		q = q -> next;
	
	q -> next = p -> next;
	delete p;
	
	}
}


int sdnv (){
	
	int minim = infinity;
	int nodus;
	
	element *p;
	
	p = prim;
	
	while (p != NULL) {
		
		if (minim > dist[p -> nod] && !visited[p -> nod]) {
			minim = dist[p -> nod];
			nodus = p -> nod;
		}
		
		p = p -> next;
	}
	
	return nodus;
}

void dijkstra (int source) {
	
	int i, u, alt;
	
	for (i = 1; i <= n; i++) 
		dist[i] = infinity;
	
	dist[source] = 0;
	addr (source);
	
	while (prim != NULL) {
		u = sdnv ();            //sMALLEST dIST nOT vISITED
		//cout << u << " ";
		deletenod (u);
		visited[u] = 1;
		
		
		for (i = 1; i <= n; i++) {
			if (A[i][u] == 1) {
				alt = dist[u] + cost[u][i];
				
				if (alt < dist[i]) {
					dist[i] = alt;
					previous[i] = u;
					
					if(!visited[i])
						addr(i);
				}
			}
		}
	}
}

int main(){
	
	int i, x, m, c, y;
	
	fin >> n >> m;
	
	for (i = 1; i <= m; i++) {
		fin >> x >> y >> c;
		A[x][y] = A[y][x] = 1;
		cost[x][y] = cost[y][x] = c;
	}
	
	/*for (i = 1; i <= n; i++) {
		cout << "\n";
		for (j = 1; j <= n; j++)
			cout << A[i][j] << " ";
	}*/
	
	
	dijkstra(1);
	
	for(i = 2; i <= n; i++)
		fout << dist[i] << " ";
	
	return 0;
}