Pagini recente » Cod sursa (job #2103938) | Cod sursa (job #2496629) | Cod sursa (job #2928196) | Cod sursa (job #235729) | Cod sursa (job #2101176)
#include <fstream>
#include <vector>
#define nmax 2005
#define kmax 18
#define inf 2000000000
using namespace std;
fstream f1("ubuntzei.in", ios::in);
fstream f2("ubuntzei.out", ios::out);
int nrconf, n, m, k, c[nmax], dist[kmax][kmax], prim, ultim, nrel, coada[nmax], viz[nmax], d[nmax], ctmin[nmax][65540];///2^kmax
vector <pair<int, int> > v[nmax];
void citire()
{
int i, x, y, cc;
f1>>n>>m>>k;
for(i=1; i<=k; i++)
f1>>c[i];
c[0]=1; c[k+1]=n; k++;
nrconf=(1<<(k+1))-1;
for(i=1; i<=m; i++)
{
f1>>x>>y>>cc;
v[x].push_back({y, cc});
v[y].push_back({x, cc});
}
}
void bellman(int ub,int iub)
{
int i, nod, vec, cost;
for(i=1; i<=n; i++)
{
d[i]=inf;
viz[i]=0;
}
d[ub]=0;
viz[ub]=1;
prim=ultim=nrel=1;
coada[ultim]=ub;
while(nrel!=0)
{
nod=coada[prim];
viz[nod]=0;
prim++;
nrel--;
for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
{
vec=(*it).first;
cost=(*it).second;
if(d[vec]> d[nod]+cost)
{
d[vec]=d[nod]+cost;
if(!viz[vec])
{
viz[vec]=1;
ultim++;
nrel++;
coada[ultim]=vec;
}
}
}
}
for(i=0; i<=k; i++)
dist[iub][i]=dist[i][iub]=d[c[i]];
}
void distante()
{
int i;
for(i=0; i<=k; i++)
bellman(c[i],i);
}
void din()
{
int config, ub, ub2;
for(ub=0; ub<=k; ub++)
for(config=0; config<=nrconf; config++)
ctmin[ub][config]=inf;
ctmin[0][1]=0;
for(config=0; config<=nrconf; config++)
for(ub=0; ub<=k; ub++)
if(((1<<ub) & config)!=0)
{
for(ub2=0; ub2<=k; ub2++)
if((ub!=ub2)&&(((1<<ub2)& config)!=0))
ctmin[ub][config]=min(ctmin[ub2][config^(1<<ub)]+ dist[ub][ub2], ctmin[ub][config]);
}
f2<<ctmin[k][nrconf];
}
int main()
{
citire();
distante(); ///dintre ubunzt
din();
return 0;
}