Pagini recente » Cod sursa (job #2954501) | Cod sursa (job #3259148) | Cod sursa (job #488373) | Cod sursa (job #3004508) | Cod sursa (job #2083923)
#include <fstream>
#include <set>
#include <vector>
#define DN 2005
#define DK 20
#define INF 2000000000
using namespace std;
ifstream fi("ubuntzei.in");
ofstream fo("ubuntzei.out");
int n,m,k;
set<pair<int,int> > S;
int C[DK],DP[DK][(1<<DK)];
int D[DK][DN];
vector<pair<int,int> > V[DN];
int rez=INF;
void dijkstra(int start,int ind)
{
for(int i=0; i<=n; i++)
D[ind][i]=INF;
D[ind][start]=0;
S.insert(make_pair(0,start));
while(!S.empty())
{
pair<int,int> aux=(*S.begin());
S.erase(S.begin());
int nod=aux.second,cost=aux.first;
for(auto to : V[nod])
if(D[ind][to.first]>cost+to.second)
{
if(S.find(make_pair(D[ind][to.first],to.first))!=S.end())
S.erase(S.find(make_pair(D[ind][to.first],to.first)));
D[ind][to.first]=cost+to.second;
S.insert(make_pair(D[ind][to.first],to.first));
}
}
}
int main()
{
fi>>n>>m>>k;
C[0]=1,C[k+1]=n;
for(int i=1; i<=k; i++)
fi>>C[i];
for(int i=1; i<=m; i++)
{
int a,b,c;
fi>>a>>b>>c;
V[a].push_back(make_pair(b,c));
V[b].push_back(make_pair(a,c));
}
for(int i=0; i<=k+1; i++)
dijkstra(C[i],i);
if (k==0)
{
fo<<D[1][n];
return 0;
}
for (int i=0; i<(1<<k); i++)
for (int j=0; j<=k; j++)
DP[i][j]=INF;
for (int i=1; i<=k; i++)
DP[1<<(i-1)][i]=D[0][C[i]];
for (int mask=2; mask<(1<<k); mask++)
for (int i=1; i<=k; i++)
if (mask&(1<<(i-1)))
for (int j=1; j<=k; j++)
DP[mask][i] = min (DP[mask][i], DP[mask^(1<<(i-1))][j]+D[j][C[i]]);
for (int i=1; i<=k; i++)
rez = min (rez, DP[(1<<k)-1][i]+D[i][n]);
fo<<rez;
fi.close();
fo.close();
return 0;
}