Pagini recente » Cod sursa (job #2708409) | Cod sursa (job #434894) | Cod sursa (job #2576203) | Cod sursa (job #399700) | Cod sursa (job #2480312)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define pb push_back
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
struct eee
{
int nod,cost;
bool operator <(const eee &a)const
{
return cost>a.cost;
}
};
struct aaa
{
int nod,cost,oras;
bool operator <(const aaa &a)const
{
return cost>a.cost;
}
};
int n,m,a1,b1,c1,dp[16][2005],b[16][2005],loc[16],ap[2005],x,y,k,z,dmin[2005];
vector<eee> v[2005];
priority_queue<aaa> q;
priority_queue<eee> q1;
int main()
{
in>>n>>m>>k;
for(int i=1;i<=n;i++)
{
dmin[i]=1<<30;
}
for(int i=1;i<=k;i++)
{
in>>loc[i];
ap[loc[i]]=1;
}
for(int i=1;i<=m;i++)
{
in>>a1>>b1>>c1;
v[a1].pb({b1,c1});
v[b1].pb({a1,c1});
}
for(int i=1;i<=k;i++)
{
for(int j=1;j<=n;j++)
{
dp[i][j]=1<<30;
}
}
q.push({1,0,0});
dp[0][1]=0;
while(!q.empty())
{
x=q.top().nod;
y=q.top().cost;
z=q.top().oras;
q.pop();
for(auto i:v[x])///orasele vecine
{
if(z<k)///daca mai putem adauga prieteni
{
if( ap[i.nod] && dp[z+1][i.nod]>dp[z][x]+i.cost)///daca avem prieten nou si nu l-am mai colectat
{
dp[z+1][i.nod]=dp[z][x]+i.cost;///cost nou
q.push({i.nod,dp[z+1][i.nod],z+1});
}
else if(dp[z][i.nod]>dp[z][x]+i.cost)///daca avem drum fara prieten si putem ajunge cu un cost mai bun
{
dp[z][i.nod]=dp[z][x]+i.cost;
q.push({i.nod,dp[z][i.nod],z});
}
}
}
}
for(int i=1;i<=k;i++)
{
q1.push({loc[i],dp[k][loc[i]]});
dmin[loc[i]]=dp[k][loc[i]];
}
while(!q1.empty())
{
x=q1.top().nod;
y=q1.top().cost;
q1.pop();
for(auto i:v[x])
{
if(dmin[i.nod]>dmin[x]+i.cost)
{
dmin[i.nod]=dmin[x]+i.cost;
q1.push({i.nod,dmin[i.nod]});
}
}
}
out<<dmin[n];
return 0;
}