Pagini recente » Cod sursa (job #2816632) | Cod sursa (job #1755301) | Cod sursa (job #996591) | Cod sursa (job #4650) | Cod sursa (job #2425253)
#include <bits/stdc++.h>
#define Dim 2007
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int N,M,K,Which[Dim],dp[Dim][Dim],a,b,c;
int cont,ans=INT_MAX;
bool viz_for[Dim],viz[Dim][Dim];
typedef pair<int,int> pi;
struct OS
{
int vertex,care,num;
};
vector <pi> V[Dim];
struct cmp
{
bool operator()(OS X,OS Y)
{
if(dp[X.vertex][X.care]>dp[Y.vertex][Y.care]) return 1;
else return 0;
}
};
priority_queue < OS,vector<OS>,cmp > minheap;
void Dijkstra()
{
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++) dp[i][j]=INT_MAX;
minheap.push({1,1,0});
viz[1][1]=1;
dp[1][1]=0;
while(!minheap.empty())
{
OS nod=minheap.top();
minheap.pop();
viz[nod.vertex][nod.care]=0;
if(viz_for[nod.vertex]==1&&dp[nod.vertex][nod.care]<=dp[nod.vertex][nod.care])
{
dp[nod.vertex][nod.vertex]=dp[nod.vertex][nod.care];
nod.care=nod.vertex;
viz[nod.vertex][nod.care]=0;
nod.num++;
}
//if(nod.num==K&&nod.vertex==N)
for(unsigned int i=0;i<V[nod.vertex].size();i++)
{
int vecin=V[nod.vertex][i].first;
int cost=V[nod.vertex][i].second;
if(dp[nod.vertex][nod.care]+cost<dp[vecin][nod.care])
{
dp[vecin][nod.care]=dp[nod.vertex][nod.care]+cost;
if(!viz[vecin][nod.care])
{
viz[vecin][nod.care]=1;
minheap.push({vecin,nod.care,nod.num});
}
}
}
}
}
int main()
{
f>>N>>M>>K;
for(int i=1;i<=K;i++)
{
f>>a;
viz_for[a]=1;
Which[i]=a;
}
for(int i=1;i<=M;i++)
{
f>>a>>b>>c;
V[a].push_back({b,c});
V[b].push_back({a,c});
}
Dijkstra();
for(int i=1;i<=K;i++) ans=min(ans,dp[N][Which[i]]);
g<<ans;
return 0;
}