Pagini recente » Cod sursa (job #884312) | Cod sursa (job #2132357) | Cod sursa (job #1153535) | Cod sursa (job #425837) | Cod sursa (job #885416)
Cod sursa(job #885416)
#include<fstream>
#include<vector>
#include<algorithm>
#define NMAX 2005
#define inf (1<<30)
#define swap2(a,b) poz[heap[a]]=b
#define vec G[minim][i].first
#define cost G[minim][i].second
#define ORAS g[last][i].first
#define DISTANTA g[last][i].second
using namespace std;
vector < pair<int,int> > G[NMAX],g[NMAX];
int n,m,d[NMAX],heap[NMAX],poz[NMAX],k,K,oras[16],H[263000][18],S,D;
inline void up(int c)
{
while(c>1)
{
if(d[heap[c/2]]>d[heap[c]])
{
swap2(c/2,c);
swap2(c,c/2);
swap(heap[c/2],heap[c]);
c>>=1;
}
else
break;
}
}
inline void down(int c)
{
int jos;
while(c<=k)
{
jos=c;
if(c*2<=k)
{
jos<<=1;
if(jos+1<=k && d[heap[jos+1]]<d[heap[jos]])
jos++;
}
else
break;;
if(d[heap[c]]>d[heap[jos]])
{
swap2(c,jos);
swap2(jos,c);
swap(heap[jos],heap[c]);
c=jos;
}
else
break;
}
}
void dijkstra(int nod)
{
int minim;
for(int i=0;i<=n;poz[i]=0,i++)
d[i]=inf;
heap[++k]=nod;
poz[nod]=1;
d[nod]=0;
while(k)
{
minim=heap[1];
swap(heap[1],heap[k]);
swap2(1,1);
k--;
down(1);
for(size_t i=0;i<G[minim].size();i++)
if(d[vec]>d[minim]+cost)
{
d[vec]=d[minim]+cost;
if(poz[vec])
up(poz[vec]);
else
{
heap[++k]=vec;
poz[heap[k]]=k;
up(k);
}
}
}
}
inline int hamilton(int c,int last)
{
if(!H[c][last])
{
H[c][last]=inf;
for(size_t i=0;i<g[last].size();i++)
if(c & (1<<ORAS))
if(ORAS!=S || c==((1<<last)+(1<<S)))
H[c][last]=min(H[c][last],hamilton(c^(1<<last),ORAS)+DISTANTA);
}
return H[c][last];
}
inline void read()
{
ifstream fin("ubuntzei.in");
fin>>n>>m>>K;
int x,y,z;
for(int i=1;i<=K;i++)
fin>>oras[i];
for(int i=1;i<=m;i++)
{
fin>>x>>y>>z;
G[x].push_back(make_pair(y,z));
G[y].push_back(make_pair(x,z));
}
fin.close();
}
void solve()
{
ofstream fout("ubuntzei.out");
S=K+1;
D=K+2;
dijkstra(1);
if(K)
{
for(int i=1;i<=K;i++)
g[i].push_back(make_pair(S,d[oras[i]]));
for(int i=1;i<=K;i++)
{
dijkstra(oras[i]);
for(int j=1;j<=k;j++)
if(i!=j)
g[j].push_back(make_pair(i,d[oras[j]]));
g[D].push_back(make_pair(i,d[n]));
}
H[1<<S][S]=1;
fout<<hamilton((1<<(K+3))-2,D)-1;
}
else
fout<<d[n]<<'\n';
}
int main()
{
read();
solve();
return 0;
}