Cod sursa(job #1885199)

Utilizator epermesterNagy Edward epermester Data 19 februarie 2017 18:40:36
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 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) {
	csucs[kezdopont].latogatott = true;
	sor.pop();
	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;
				csucsok start;
				start.pont = (*iterator).cel;
				start.tavolsag = csucs[(*iterator).cel].tavolsag;
				sor.push(start);
			}
		}
	}
	while (!sor.empty())
		if (!sor.top().latogatott) {
			dijkstra(sor.top().pont);
			break;
		}
		else sor.pop();
}

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

int main() {
	read();

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