Pagini recente » Cod sursa (job #1496) | Cod sursa (job #1956719) | Cod sursa (job #1525161) | Cod sursa (job #478985) | Cod sursa (job #617289)
Cod sursa(job #617289)
/*
* Autor: Paul Herman
* Problema: Dijkstra(n^2)
* Data: 01.10.2011
* Punctaj: 50
* Link: http://www.infoarena.ro/problema/dijkstra
*/
#include <fstream>
#include <vector>
#include <set>
using namespace std;
struct muchie
{
int cost; //Costul pentru a ajunge de la A la B
unsigned int b; //Nodul B
};
struct nod
{
bool vizitat;
int cost;
vector<muchie> vecini;
};
#define INFINIT 0x3f3f3f
nod noduri[50001]; //Nodurile grafului
unsigned long int n; //Numarul de noduri
unsigned int m; //Nr. de muchii
//1 3 2 5
struct comparare
{
inline bool operator() (const int& lhs, const int& rhs) const
{
return noduri[lhs].cost < noduri[rhs].cost;
}
};
multiset<int, comparare> lista;
void citire()
{
unsigned long int a;
muchie b;
ifstream fin("dijkstra.in");
fin >> n >> m;
for (unsigned int i = 1; i <= m ; i++)
{
fin >> a >> b.b >> b.cost;
noduri[a].vecini.push_back(b);
}
fin.close();
}
void scriere()
{
ofstream fout("dijkstra.out");
for (unsigned long int i = 2; i <= n; i++)
{
if (noduri[i].vizitat == true)
fout << noduri[i].cost << " ";
else
fout << "0 ";
}
fout.close();
}
void Dijkstra()
{
int nod_curent = 1;
noduri[1].cost = 0; //Costul pt. a ajunge la sursa e 0
lista.insert(1);
for (unsigned long int i = 2; i <= n; i++)
{
noduri[i].vizitat = false; //Nu am vizitat nici und nod
noduri[i].cost = INFINIT; //Costul pt. a ajunge la restul nodurilor e infinit
}
while (lista.size() > 0)
{
//Cautam nodul nevizitat cel mai apropiat de sursa
nod_curent = *lista.begin();
lista.erase(lista.begin());
noduri[nod_curent].vizitat = true; //Marcam nodul curent ca vizitat
for (unsigned int i = 0; i < noduri[nod_curent].vecini.size(); i++) //Parcurgem toti vecinii nodului curent
{
if ((noduri[nod_curent].cost + noduri[nod_curent].vecini[i].cost) < noduri[noduri[nod_curent].vecini[i].b].cost)
{
noduri[noduri[nod_curent].vecini[i].b].cost = noduri[nod_curent].cost + noduri[nod_curent].vecini[i].cost;
lista.insert(noduri[nod_curent].vecini[i].b);
}
}
}
}
int main()
{
citire();
Dijkstra();
scriere();
return 0;
}