Pagini recente » Cod sursa (job #818138) | Cod sursa (job #2837506) | Cod sursa (job #258678) | Cod sursa (job #1149654) | Cod sursa (job #2061463)
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
const int N = 2005;
const int INF = 999999999;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
struct poz{
int p,d;
};
int n,m,k;
int mat[N];
bool prieteni[N];
int dist[N];
bool ales[N];
queue <int> q;
vector <poz> V[N];
void parc()
{
q.push(1);
dist[1] = 0;
while(!q.empty())
{
int num = q.front();
q.pop();
ales[num] = 0;
for(int i = 0; i< V[num].size(); i++)
{
int ds = dist[num] + V[num][i].d;
int nx = V[num][i].p;
//g<<num<<" "<<nx<<" | "<<ds<<" "<<prieteni[nx]+mat[num]<<"\n";
if(prieteni[nx]==0)
{
if(mat[nx]<mat[num])
{
dist[nx] = ds;
mat[nx] = mat[num];
if(ales[nx]==0)
{
ales[nx]=1;
q.push(nx);
}
}
else if(mat[nx]==mat[num] && ds < dist[nx])
{
dist[nx] = ds;
if(ales[nx]==0)
{
ales[nx]=1;
q.push(nx);
}
}
}
else
{
if(mat[nx]<mat[num])
{
dist[nx] = ds;
mat[nx] = mat[num] + prieteni[nx];
if(ales[nx]==0)
{
ales[nx]=1;
q.push(nx);
}
}
else if(mat[nx] == mat[num] + prieteni[nx] && ds <dist[nx])
{
dist[nx] = ds;
if(ales[nx]==0)
{
ales[nx]=1;
q.push(nx);
}
}
else if(mat[nx] < mat[num] + prieteni[nx] && ds <dist[nx])
{
dist[nx] = ds;
mat[nx] = mat[num] + prieteni[nx];
if(ales[nx]==0)
{
ales[nx]=1;
q.push(nx);
}
}
}
}
}
}
int main()
{
f>>n>>m;
for(int i = 1; i<= n; i++)
{
dist[i] = INF;
}
f>>k;
for(int i = 1; i<= k; i++)
{
int x;
f>>x;
prieteni[x] = 1;
}
for(int i = 1; i<= m; i++)
{
int x,y,ds;
f>>x>>y>>ds;
V[x].push_back({y,ds});
V[y].push_back({x,ds});
}
parc();
g<<dist[n];
f.close();
g.close();
return 0;
}