Cod sursa(job #1890407)

Utilizator tonisnakesBoar Antonio tonisnakes Data 23 februarie 2017 11:30:18
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
#include <queue>
#define NMAX 2005
#define MMAX 10005
#define inf 0x3f3f3f3f
using namespace std;

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

int n, m, k, dist[NMAX][MMAX];
bitset <NMAX> ubuntzel;
bitset <MMAX> checked[NMAX];
vector <pair <int, int> > muchii[NMAX];
struct Drum {
	int nod, dist, ubu;
	Drum (int x, int y, int z) {
		nod = x;
		dist = y;
		ubu = z;
	}
	bool operator<(const Drum& altu) const {
		return dist < altu.dist;
	}
};
priority_queue <Drum> pq;

int dijkstra () {
	for (int i = 1; i <= n; ++i) {
		for (int j = 0; j <= k; ++j) {
			dist[i][j] = inf;
		}
	}
	dist[1][0] = 0;
	pq.push(Drum(1,0,0));
	while (pq.size()) {
		Drum d = pq.top();
		pq.pop();
		if (checked[d.nod][d.ubu]) {
			continue;
		}
		checked[d.nod][d.ubu] = 1;
		for (int i = 0; i < muchii[d.nod].size(); ++i) {
			Drum nou = Drum(muchii[d.nod][i].first,dist[d.nod][d.ubu] + muchii[d.nod][i].second,d.ubu);
			nou.ubu += ubuntzel[nou.nod];
			if (nou.ubu <= k && nou.dist < dist[nou.nod][nou.ubu]) {
				dist[nou.nod][nou.ubu] = nou.dist;
				nou.dist = -nou.dist;
				pq.push(nou);
			}
		}
	}
	return dist[n][k];
}

int main () 
{
	fin >> n >> m;
	fin >> k;
	int x, y, z;
	for (int i = 1; i <= k; ++i) {
		fin >> x;
		ubuntzel[x] = 1;
	}
	for (int i = 1; i <= m; ++i) {
		fin >> x >> y >> z;
		muchii[x].push_back(make_pair(y,z));
		muchii[y].push_back(make_pair(x,z));
	}
	fout << dijkstra();
	
	fin.close();
	fout.close();
	return 0;
}