Pagini recente » Istoria paginii runda/oni-2012-ziua2-11-12/clasament | Cod sursa (job #136120) | Cod sursa (job #1856461) | Cod sursa (job #363918) | Cod sursa (job #1590371)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
const int N_max = 2005;
const int M_max = 10005;
const int INF = 2100000005;
struct ELEMENT{int nod, dist;};
ELEMENT v[N_max];
int lst[N_max];
int vf[2 * M_max];
int urm[2 * M_max];
int cost[2 * M_max];
int nr;
vector <int> C;
int d[N_max];
int p, u;
int L_min;
int N, M, K;
void BF(int S)
{
int i, x, y, poz, COST;
for(i = 1; i <= N; i++) d[i] = INF;
C.clear();
p = u = 0;
//INSEREZ IN COADA NODUL S
C.push_back(S);
d[S] = 0;
while(p <= u)
{
x = C[p++];
//PARCURG VECINII y AI LUI x
poz = lst[x];
while(poz != 0)
{
y = vf[poz];
COST = cost[poz];
if(d[y] > d[x] + COST)
{
u++;
C.push_back(y);
d[y] = d[x] + COST;
}
poz = urm[poz];
}
}
//for(i = 1; i <= N; i++) cout << d[i] << " ";
//cout << '\n';
}
void calcul_dist()
{
int poz, x, y;
for(int i = 1; i <= N; i++) d[i] = INF;
//INSEREZ IN COADA NODUL 1
C.push_back(1);
d[1] = 0;
while(p <= u)
{
x = C[p++];
//PARCURG VECINII y AI LUI x
poz = lst[x];
while(poz != 0)
{
y = vf[poz];
if(d[y] > 1 + d[x])
{
u++;
C.push_back(y);
d[y] = 1 + d[x];
}
poz = urm[poz];
}
}
}
bool exc(ELEMENT e1, ELEMENT e2)
{
return e1.dist < e2.dist;
}
void adauga(int x, int y, int c)
{
//ADAUGA IN LISTA LUI x PE y
nr++;
vf[nr] = y;
urm[nr] = lst[x];
cost[nr] = c;
lst[x] = nr;
}
int main()
{
int i, x, y, c;
in >> N >> M;
in >> K;
for(i = 1; i <= K; i++) in >> v[i].nod;
for(i = 1; i <= M; i++)
{
in >> x >> y >> c;
adauga(x, y, c);
adauga(y, x, c);
}
calcul_dist();
for(i = 1; i <= K; i++) v[i].dist = d[ v[i].nod ];
sort(v + 1, v + K + 1, exc);
/*
for(i = 1; i <= K; i++) cout << v[i].nod << " ";
cout << '\n';
for(i = 1; i <= K; i++) cout << v[i].dist << " ";
cout << '\n';
*/
BF(1);
L_min += d[ v[1].nod ];
//cout << L_min << '\n';
for(i = 1; i < K; i++)
{
BF(v[i].nod);
L_min += d[ v[i + 1].nod ];
//cout << L_min << '\n';
}
BF(v[K].nod);
L_min += d[ N ];
out << L_min;
return 0;
}