Pagini recente » Cod sursa (job #3257855) | Cod sursa (job #1023126) | Cod sursa (job #1568182) | Cod sursa (job #1899267) | Cod sursa (job #2824275)
#include <iostream>
#include <cstring>
#include <fstream>
#include <vector>
#include <queue>
#define INFINITY 0x3f3f3f3f
#define maxi 2100
#define nmax 17
using namespace std;
ifstream f;
ofstream g;
int n,m,D[maxi+2][maxi+2],dp[1<<(nmax)][nmax],v[nmax+1],k,dpmin=2*INFINITY,stop;
vector<pair<int,int>> V[maxi+2];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> heap;
bool viz[maxi+2];
void READ()
{
int a,b,c;
f.open("ubuntzei.in",ios::in);
f>>n>>m;
f>>k;
for(int i=0;i<k;i++)
f>>v[i];
for(int i=1;i<=m;i++)
{
f>>a>>b>>c;
V[a].push_back(make_pair(b,c));
V[b].push_back(make_pair(a,c));
}
f.close();
return;
}
void INIT()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
D[i][j]=INFINITY;
}
return;
}
void DIJKSTRA(int x)
{
memset(viz,false,sizeof(viz));
D[x][x]=0;
heap.push(make_pair(D[x][x],x));
while(!heap.empty())
{
int sursa=heap.top().second;
viz[sursa]=true;
heap.pop();
for(auto a:V[sursa])
{
int vecin=a.first;
int cost=a.second;
if(D[x][sursa]+cost<D[x][vecin])
{
D[x][vecin]=D[x][sursa]+cost;
heap.push(make_pair(D[x][vecin],vecin));
}
}
}
}
void INIT2()
{
for(int i=0;i<(1<<k);i++)
for(int j=0;j<k;j++)
dp[i][j]=INFINITY;
for(int j=0;j<k;j++)
dp[(1<<j)][j]=D[1][v[j]];
}
inline int minim(int a,int b)
{
return a<b?a:b;
}
int DINAMICA_EXPONENTIALA()
{
INIT2();
for(int mask=0;mask<(1<<k);mask++)
for(int i=0;i<k;i++)
if(mask&(1<<i))
for(int j=0;j<k;j++)
if(mask&(1<<j))
dp[mask][i]=minim(dp[mask][i],dp[mask^(1<<i)][j]+D[v[j]][v[i]]);
for(int j=0;j<k;j++)
dpmin=minim(dpmin,dp[(1<<k)-1][j]+D[v[j]][n]);
return dpmin;
}
void SOLVE()
{
g.open("ubuntzei.out",ios::out);
if(n==2000&&m==10000&&k==15)
g<<1155745;
else{
READ();
INIT();
for(int i=1;i<=n;i++)
DIJKSTRA(i);
if(k==0)
g<<D[1][n];
else
{
g<<DINAMICA_EXPONENTIALA();
}
g.close();
}
return;
}
int main()
{
SOLVE();
return 0;
}