Pagini recente » Cod sursa (job #2240418) | Cod sursa (job #1307266) | Cod sursa (job #2852726) | Cod sursa (job #771455) | Cod sursa (job #2122124)
#include <bits/stdc++.h>
#define NMAX 2001
#define KMAX 16
using namespace std ;
ifstream fin("ubuntzei.in") ;
ofstream fout("ubuntzei.out") ;
vector<pair<int,int> > graf[NMAX] ;
int t[KMAX] , d[NMAX] , dist[KMAX][NMAX] , dp[1<<KMAX][KMAX] ;
bool ubun[KMAX] ;
int n , m , k ;
class compar
{
public:
bool operator () ( const int &x , const int &y )
{
return d[x] > d[y] ;
}
};
void citire()
{
int i , x , y , c ;
fin >> n >> m ;
fin >> k ;
for ( i = 0 ; i < k ; i++ )
{
fin >> t[i] ;
ubun[t[i]] = true ;
}
for ( i = 1 ; i <= m ; i++ )
{
fin >> x >> y >> c ;
graf[x].push_back(make_pair(y,c)) ;
graf[y].push_back(make_pair(x,c)) ;
}
}
void dijkstra(int nod,int idx)
{
int i ;
priority_queue<int,vector<int> ,compar> pq ;
pq.push(nod) ;
memset(d,0x3f3f3f3f,4*n+4) ;
d[nod] = 0 ;
dist[idx][nod] = 0 ;
while (!pq.empty())
{
nod = pq.top() ;
pq.pop() ;
for ( i = 0 ; i < graf[nod].size() ; i++ )
{
if ( d[graf[nod][i].first] > d[nod] + graf[nod][i].second )
{
dist[idx][graf[nod][i].first] = d[nod] + graf[nod][i].second ;
d[graf[nod][i].first] = d[nod] + graf[nod][i].second ;
pq.push(graf[nod][i].first) ;
}
}
}
}
void dinamic()
{
int i , j , idx ;
for ( i = 1 ; i < (1<<k) ; i++ )
for ( j = 0 ; j < k ; j++ )
dp[i][j] = 0x3f3f3f3f ;
for ( i = 0 ; i < k ; i++ )
dp[1<<i][t[i]] = d[t[i]] ;
for ( i = 1 ; i < (1<<k) ; i++ )
{
for ( j = 0 ; j < k ; j++ )
{
if ( (i&(1<<j)) != 0 )
{
for ( idx = 0 ; idx < k ; idx++ )
{
if ( (i&(1<<idx)) == 0 )
{
dp[i|(1<<idx)][idx] = min(dp[i|(1<<idx)][idx],dp[i][j]+dist[j][t[idx]]) ;
}
}
}
}
}
}
int main()
{
int i , j , sol ;
citire() ;
dijkstra(1,k) ;
if ( k == 0 )
{
fout << d[n] ;
return 0 ;
}
for ( i = 0 ; i < k ; i++ )
dijkstra(t[i],i) ;
dijkstra(1,k) ;
dinamic() ;
sol = 0x3f3f3f3f ;
for ( i = 0 ; i < k ; i++ )
{
sol = min(sol,dp[(1<<k)-1][i]+dist[i][n]) ;
}
fout << sol ;
}