Cod sursa(job #1881787)

Utilizator epermesterNagy Edward epermester Data 16 februarie 2017 18:53:14
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#include<iostream>
#include<fstream>
#include<queue>
#include<vector>
#include<limits.h>
using namespace std;

int N;		//csucsok szama

struct el {
	unsigned short cel;
	short hossz;
};

struct csucsok {
	unsigned short pont;
	bool latogatott=false;
	vector<el> szomszedok;
	long long tavolsag = LLONG_MAX;                        //megj.
};

struct compare
{
	bool operator()(csucsok& l, csucsok& r)
	{
		return l.tavolsag > r.tavolsag;
	}
};
priority_queue<csucsok, vector<csucsok>, compare > sor;			//&

vector<csucsok> csucs;

void read() {
	int M;		//utak szama
	ifstream in("dijkstra.in");
	in >> N >> M;
	for (int i = 0;i < N;++i) {
		csucsok temp;
		temp.pont = i;
		csucs.push_back(temp);
	}
	for (int i = 0;i < M;++i) {
		unsigned short A, B, C;
		in >> A >> B >> C;
		A--; B--;
		el temp;
		temp.cel = B;
		temp.hossz = C;
		csucs[A].szomszedok.push_back(temp);
		temp.cel = A;
		csucs[B].szomszedok.push_back(temp);
	}
	in.close();
}

void dijkstra(short int kezdopont) {
	sor.pop();
	long long min = LLONG_MAX;				//
	short minHol = -1;
	vector<el>::iterator iterator;
	for (iterator = csucs[kezdopont].szomszedok.begin(); iterator != csucs[kezdopont].szomszedok.end();iterator++) {
		if (!csucs[(*iterator).cel].latogatott) {
			if (csucs[kezdopont].tavolsag + (*iterator).hossz < csucs[(*iterator).cel].tavolsag) {
				csucs[(*iterator).cel].tavolsag = csucs[kezdopont].tavolsag + (*iterator).hossz;
			}
			if (csucs[(*iterator).cel].tavolsag < min) {								//?
				min = csucs[(*iterator).cel].tavolsag;
				minHol = (*iterator).cel;
			}
		}
	}
	if (minHol != -1) {
		csucsok start;
		start.pont = minHol;
		start.tavolsag = min;
		sor.push(start);
		csucs[minHol].latogatott = true;
	}
	if (!sor.empty()) dijkstra(sor.top().pont);
}

void print() {
	ofstream out("dijkstra.out");
	for (int i = 1;i < N;++i) {
		if (csucs[i].tavolsag > 5000000000) out << 0 << " ";
		else out << csucs[i].tavolsag << " ";
	}
	out.close();
}

int main() {
	read();

	sor.push(csucs[0]);
	csucs[0].tavolsag = 0;
	csucs[0].latogatott = true;
	dijkstra(0);
	print();
}