Pagini recente » Cod sursa (job #1378245) | Cod sursa (job #2442202) | Cod sursa (job #2523662) | Cod sursa (job #1068922) | Cod sursa (job #2573918)
#include <bits/stdc++.h>
#define maxn 2005
#define inf 0x3f3f3f3f
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m;
int k,pr[18];
bool prieten[maxn];
bool viz[maxn];
bool incoada[maxn];
int aux;
int d[maxn];
vector <pair<int,int> > lista[maxn];
void read()
{
fin>>n>>m;
fin>>k;
for(int i=1;i<=k;i++){
fin>>pr[i];
prieten[pr[i]]=1;
}
int x,y,c;
for(int i=1;i<=m;i++)
{
fin>>x>>y>>c;
lista[x].push_back({y,c});
lista[y].push_back({x,c});
}
}
struct cmp
{
bool operator()(int x,int y)
{
return d[x]>d[y];
}
};
int Dijkstra(int start)
{
priority_queue<int,vector<int>,cmp> q;
for(int i=1;i<=n;i++)
d[i]=inf,incoada[i]=0;
incoada[start]=1;
d[start]=0;
q.push(start);
while(!q.empty())
{
int nod=q.top();
incoada[nod]=0;
q.pop();
for(auto x:lista[nod])
{
int vecin=x.first;
int cost=x.second;
if(d[vecin]>d[nod]+cost)
{
d[vecin]=d[nod]+cost;
if(prieten[vecin] && !viz[vecin]){
viz[vecin]=1;
aux=vecin;
return d[vecin];
}
if(!incoada[vecin])
q.push(vecin);
}
}
}
aux=n;
//inseamna ca am ajuns la final si returnam d[n]
return d[n];
}
bool ok()
{
for(int i=1;i<=k;i++)
if(!viz[pr[i]])
return false;
return true;
}
int main()
{
read();
if(k==0)
{
fout<<Dijkstra(1);
return 0;
}
int costTotal=0,pas=0;
aux=1;
cout<<1<<" ";
costTotal+=Dijkstra(aux);
cout<<aux<<" ";
while(!ok())
{
costTotal+=Dijkstra(aux);
cout<<aux<<" ";
}
if(aux!=n)
costTotal+=Dijkstra(aux);
cout<<aux;
fout<<costTotal;
return 0;
}