Pagini recente » Cod sursa (job #2302577) | Cod sursa (job #1865382) | Cod sursa (job #466315) | Cod sursa (job #2122301) | Cod sursa (job #891770)
Cod sursa(job #891770)
#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(long long viz[MAX_SIZE], long long poz)
{
viz[poz]=1;
int c[MAX_SIZE],k=0;
it=graph_mc[poz].begin();
end=graph_mc[poz].end();
cout<<"\n";
for( ; it!=end-1; it++)
if(!viz[it->node])
{
cout<<it->node<<"-";
c[++k]=it->cost+dmin(viz, it->node);
}
if(!k)
return (end-1)->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);
viz[k+1]=0;
drum=dmin(viz, 0);
out<<drum;
in.close();
out.close();
return 0;
}