Pagini recente » Cod sursa (job #1591142) | Cod sursa (job #1724235) | Cod sursa (job #2585091) | Cod sursa (job #1950853) | Cod sursa (job #2298223)
#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];
pair <int,int> dp[(1<<maxk)+5];
vector <int> qu;
int dst[maxn+5];
int n, m, k;
int bellman ( int bg, int ed )
{
int lo = 0, nod, nn, i;
for ( i = 0; i < n; i++ )
dst[i] = inf;
qu.push_back ( bg );
dst[bg] = 0;
while ( lo <= qu.size() )
{
nod = qu[lo++];
for ( i = 0; i < g[nod].size(); i++ )
{
nn = g[nod][i].first;
if ( dst[nn] > dst[nod] + g[nod][i].second )
{
dst[nn] = dst[nod] + g[nod][i].second;
qu.push_back ( nn );
}
}
}
qu.clear();
return dst[ed];
}
int main ()
{
ifstream fin ( "ubuntzei.in" );
ofstream fout ( "ubuntzei.out" );
fin >> n >> m >> k;
int i;
for ( i = 0; i < k; i++ )
{
fin >> wp[i];
wp[i]--;
}
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} );
}
dp[0] = {0,0};
for ( i = 1; i < (1<<k); i++ )
dp[i] = {inf,0}; /// distanta de la 0, ult oras
int conf, conn, newd;
for ( conf = 0; conf < (1<<k); conf++ )
for ( i = 0; i < k; i++ )
if ( (conf & (1<<i)) == 0 )
{
conn = conf + (1<<i);
newd = dp[conf].first + bellman ( dp[conf].second, wp[i] );
if ( dp[conn].first > newd )
{
dp[conn].first = newd;
dp[conn].second = i;
}
}
fout << dp[(1<<k)-1].first + bellman ( dp[(1<<k)-1].second, n - 1 );
fin.close ();
fout.close ();
return 0;
}