Pagini recente » Cod sursa (job #135920) | Cod sursa (job #1511892) | Cod sursa (job #2479714) | Cod sursa (job #838161) | Cod sursa (job #2302466)
#include <bits/stdc++.h>
#define maxn 2000
#define maxm 10000
#define maxk 15
#define inf INT_MAX / 2 - 1
using namespace std;
vector <pair<int,int> > g[maxn+5];
int wp[maxk+5];
int dp[(1<<maxk)+5][maxk+5]; /// conf, ult oras
vector <int> qu;
int dst[maxn+5][maxn+5];
int n, m, k;
void bellman ( int bg )
{
int lo = 0, nod, nn, i;
qu.push_back ( bg );
dst[bg][bg] = 0;
while ( lo < qu.size() )
{
nod = qu[lo++];
for ( i = 0; i < g[nod].size(); i++ )
{
nn = g[nod][i].first;
if ( dst[bg][nn] > dst[bg][nod] + g[nod][i].second )
{
dst[bg][nn] = dst[bg][nod] + g[nod][i].second;
qu.push_back ( nn );
}
}
}
qu.clear();
}
int main ()
{
ifstream fin ( "ubuntzei.in" );
ofstream fout ( "ubuntzei.out" );
fin >> n >> m >> k;
int i, j;
for ( i = 0; i < k; i++ )
{
fin >> wp[i];
wp[i]--;
}
for ( i = 0; i < n; i++ )
for ( j = 0; j < n; j++ )
dst[i][j] = inf;
int a, b, c;
for ( i = 0; i < m; i++ )
{
fin >> a >> b >> c;
a--; b--;
g[a].push_back ( {b, c} );
g[b].push_back ( {a, c} );
}
for ( i = 0; i < k; i++ )
bellman ( wp[i] );
bellman ( 0 );
bellman ( n - 1 );
int conf, conn;
for ( conf = 0; conf < (1<<k); conf++ )
for ( i = 0; i < k; i++ )
dp[conf][i] = inf;
for ( i = 0; i < k; i++ )
dp[1<<i][i] = dst[0][wp[i]];
for ( conf = 0; conf < (1<<k); conf++ )
for ( i = 0; i < k; i++ )
if ( (conf & (1<<i)) == 0 )
{
conn = conf + (1<<i);
for ( j = 0; j < k; j++ )
if ( conf & (1<<j) )
dp[conn][i] = min ( dp[conn][i], dp[conf][j] + dst[wp[j]][wp[i]] );
}
int _m = inf;
for ( i = 0; i < k; i++ )
_m = min ( _m, dp[(1<<k)-1][i] + dst[wp[i]][n-1] );
if ( k > 0 )
fout << _m;
else
fout << dst[0][n-1];
fin.close ();
fout.close ();
return 0;
}