Pagini recente » Cod sursa (job #123353) | Cod sursa (job #3215090) | Cod sursa (job #1729751) | Cod sursa (job #1203313) | Cod sursa (job #1902743)
#include <bits/stdc++.h>
#define nmax 2005
using namespace std;
int n,m,k;
vector <pair <int,int> > v[nmax];
set <pair <int,int> > st;
int dp[20][nmax];
int dist[nmax][nmax];
int city[20];
void Push(int nod,int cost,int loc){
set <pair <int,int> >::iterator it=st.find(make_pair(dist[loc][nod],nod));
if(it!=st.end()) st.erase(it);
st.insert(make_pair(cost,nod));
dist[loc][nod]=cost;
}
void Dijkstra(int loc,int dest){
for(int i=0;i<=n;i++)
dist[loc][i]=INT_MAX;
Push(dest,0,loc);
while(!st.empty()){
int now=st.begin()->second;
st.erase(st.begin());
for(int i=0;i<v[now].size();i++){
int cost=v[now][i].second;
int next=v[now][i].first;
if(dist[loc][next]>dist[loc][now]+cost)
Push(next,dist[loc][now]+cost,loc);
}
}
}
int BTK(int now,int conf){
if(conf==0)
return dist[k][city[now]];
if(dp[now][conf]<INT_MAX)
return dp[now][conf];
int pw=1;
for(int i=0;i<k;i++,pw*=2)
if(conf&pw){
int val=BTK(i,conf-pw)+dist[city[i]][now];
dp[now][conf]=min(dp[now][conf],val);
}
}
int main()
{
int x,y,cost;
ios_base::sync_with_stdio(false);
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
fin>>n>>m>>k;
for(int i=0;i<k;i++)
fin>>city[i];
for(int i=0;i<m;i++){
fin>>x>>y>>cost;
v[x].push_back(make_pair(y,cost));
v[y].push_back(make_pair(x,cost));
}
int lim=(1<<17);
for(int i=0;i<=19;i++)
for(int j=0;j<lim;j++)
dp[i][j]=INT_MAX;
for(int i=0;i<k;i++)
Dijkstra(i,city[i]);
Dijkstra(k,1);
Dijkstra(k+1,n);
if(k==0){
fout<<dist[1][1];
return 0;
}
int conf=(1<<k)-1;
int mn=INT_MAX;
bool ismn=true;
for(int i=0;i<k;i++){
int new_val=BTK(i,conf-(1<<i))+dist[city[i]][k+1];
if(ismn||new_val<mn){
mn=new_val;
ismn=false;
}
}
fout<<mn<<'\n';
fout.close();
fin.close();
return 0;
}