Cod sursa(job #2170335)

Utilizator Catalin121Catalin Sumanaru Catalin121 Data 14 martie 2018 23:32:15
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <climits>
#include <Windows.h>
#define NMAX 2001

using namespace std;

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

int n, k, c[NMAX], v[NMAX];
vector<pair<int, int>> g[NMAX];

void citire()
{
	int m;
	fin >> n >> m >> k;
	for (int i = 1; i <= k; i++)
		fin >> c[k];

	for (int i = 1; i <= m; i++)
	{
		int x, y, z;
		fin >> x >> y >> z;
		g[x].push_back(make_pair(y, z));
		g[y].push_back(make_pair(x, z));
	}
	fin.close();
}

void dijkstra(int x)
{
	fill(v + 1, v + n + 1, INT_MAX);
	v[x] = 0;
	queue<int> q;
	q.push(x);
	bool inQ[NMAX];
	fill(inQ + 1, inQ + n + 1, 0);
	inQ[x] = 1;

	while (!q.empty())
	{
		x = q.front();
		q.pop();
		inQ[x] = 0;

		for(vector<pair<int,int>>::iterator i = g[x].begin(); i!=g[x].end(); i++)
			if (v[i->first] > v[x] + i->second)
			{
				v[i->first] = v[x] + i->second;
				if (inQ[i->first] == 0)
				{
					inQ[i->first] = 1;
					q.push(i->first);
				}
			}
	}
}

void solution()
{
	int min;
	int s = 0;
	dijkstra(1);
	int viz[NMAX];
	fill(viz, viz + n + 1, 0);
	v[0] = INT_MAX;
	for (int j = 1; j <= k; j++)
	{
		min = 0;
		for (int i = 1; i <= k; i++)
			if (!viz[i] && v[c[i]] < v[c[min]]) min = i;
		s = s + v[c[min]];
		dijkstra(c[min]);
	}
	s = s + v[n];
	fout << s;
	fout.close();
}

int main()
{
	citire();
	solution();
	return 0;
}