Pagini recente » Cod sursa (job #1145717) | Cod sursa (job #1263950) | Cod sursa (job #225246) | Cod sursa (job #3242598) | Cod sursa (job #891915)
Cod sursa(job #891915)
//#include<iostream>
#include<fstream>
#include<algorithm>
#include<utility>
#include<queue>
#include<vector>
#include<string.h>
using namespace std;
#define edge pair<int,int>
#define mp make_pair
#define pb push_back
#define node second
#define cost first
const int MAX_SIZE=2e3+3;
const int oo=(1<<30)-1;
vector<edge> graph[MAX_SIZE];
vector<edge> graph_mc[MAX_SIZE];
vector<int> dist(MAX_SIZE,oo);
vector<edge>::iterator it,end;
priority_queue<edge, vector<edge>, greater<edge> > heap;
int dmin(int viz[MAX_SIZE], int poz)
{
viz[poz]=1;
int co[MAX_SIZE],k=0,min;
it=graph_mc[poz].begin();
end=graph_mc[poz].end();
for(;it!=end;++it)
{
if(viz[it->node]==0)
co[k++]=it->cost+dmin(viz, it->node);
if(!k && it+1==end)
return it->cost;
}
min=co[0];
for(int i=1;i<k;i++)
if(co[i]<min)
min=co[i];
return min;
}
int main ()
{
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n,m,k,c[MAX_SIZE],viz[MAX_SIZE],drum=0;
in>>n>>m>>k;
c[0]=1;
c[k+1]=n;
for(int i=1;i<=k;i++)
in>>c[i];
sort(c,c+k+1);
for(int i=1;i<=m;i++)
{
int cTo,cFrom,cCost;
in>>cFrom>>cTo>>cCost;
graph[cFrom].pb(mp(cCost,cTo));
graph[cTo].pb(mp(cCost,cFrom));
}
for(int i=0;i<=k;i++)
{
if(c[i]==c[i+1])
continue;
heap.push(mp(0,c[i]));
dist[c[i]]=0;
while(!heap.empty())
{
int current=heap.top().node;
heap.pop();
it=graph[current].begin();
end=graph[current].end();
for(;it!=end;++it)
if(dist[current]+it->cost<dist[it->node])
{
dist[it->node]=dist[current]+it->cost;
heap.push(mp(dist[it->node],it->node));
}
}
for(int j=i+1;j<=k+1;j++)
{
graph_mc[i].pb(mp(dist[c[j]],j));
graph_mc[j].pb(mp(dist[c[j]],i));
}
dist.clear();
dist.assign(MAX_SIZE,oo);
}
for(int i=0;i<=k+1;i++)
viz[i]=0;
viz[k+1]=1;
drum=dmin(viz, 0);
out<<drum;
in.close();
out.close();
return 0;
}