Pagini recente » Cod sursa (job #1569154) | Cod sursa (job #202338) | Autentificare | Cod sursa (job #1330362) | Cod sursa (job #1569589)
#include<iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>
#define nmax 2002
using namespace std;
struct nod{ int nxt,cst;};
int n,m1,k;
vector<nod> m[nmax];
int pri[18];
short num[nmax];
int d[nmax];
int dist[18][18];
vector<int> v;
class comp
{
public:
bool operator()(int a,int b)
{
return d[a]>d[b];
}
};
priority_queue<int,vector<int>,comp> q;
int dij(int row,int nd)
{
int i,nd1;
for(i=1;i<=n;i++) d[i]=0x3ffffff;
d[nd]=0;
q.push(nd);
while(!q.empty())
{
nd1=q.top(); q.pop();
for(i=0 ; i<m[nd1].size() ; i++)
if(d[ m[nd1][i].nxt ] > d[nd1]+ m[nd1][i].cst )
{
if(num[ m[nd1][i].nxt ]) dist[row][ num[m[nd1][i].nxt] ]=d[ m[nd1][i].nxt ]= d[nd1] + m[nd1][i].cst;
else d[ m[nd1][i].nxt ]= d[nd1] + m[nd1][i].cst;
q.push( m[nd1][i].nxt );
}
}
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
int i,j,n1,n2,cs;
nod nod1;
scanf("%d%d",&n,&m1);
scanf("%d",&k);
num[1]=1;
for(i=1;i<=k;i++) { scanf("%d",&pri[i]); num[pri[i]]=i+1; }
num[n]=k+2;
for(;m1;m1--)
{
scanf("%d%d%d",&n1,&n2,&cs);
nod1.nxt=n2; nod1.cst=cs;
m[n1].push_back(nod1);
nod1.nxt=n1;
m[n2].push_back(nod1);
}
if(k==0)
{
dij(1,1);
printf("%d\n",d[n]);
}
else
{
int maxim=-3;
int dis;
dij(1,1);
for(i=1;i<=k;i++) dij(i+1,pri[i]);
if(k>1)
{
for(i=2;i<=k+1;i++) v.push_back(i);
do {
dis=dist[1][v[0]];
for (i = 0; i <= k; ++i)
{
//cout<<v[i]<<' ';
dis+=dist[ v[i] ][ v[i+1] ];
} //cout<<'\n';
if(dis>maxim) maxim=dis;
} while (next_permutation(v.begin(), v.end()));
}
else maxim=dist[1][2]+dist[2][3];
printf("%d\n",maxim);
}
fclose(stdin);
fclose(stdout);
return 0;
}