Pagini recente » Cod sursa (job #1022410) | Cod sursa (job #1099903) | Cod sursa (job #550222) | Cod sursa (job #3276022) | Cod sursa (job #891722)
Cod sursa(job #891722)
#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(long long viz[MAX_SIZE], long long n, long long poz)
{
viz[poz]=1;
int c[MAX_SIZE],k=0;
it=graph_mc[poz].begin();
end=graph_mc[poz].end();
for( ; it!=end-1; it++)
if(!viz[it->node])
c[++k]=it->cost+dmin(viz, n, viz[poz]);
if(!k)
return end->cost;
return (int)min_element(c,c+k);
}
int main ()
{
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
long long 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));
}
//drum+=dist[c[i+1]];
dist.clear();
dist.assign(MAX_SIZE,oo);
}
/*for(int i=0;i<=k+1;i++,cout<<"\n")
{
it=graph_mc[i].begin();
end=graph_mc[i].end();
for(;it!=end;it++,cout<<" | ")
{
cout<<i<<"->"<<it->node<<"="<<it->cost;
}
}*/
memset(viz,0,k);
//drum=dmin(viz, k, 1);
out<<drum;
in.close();
out.close();
return 0;
}