Pagini recente » Cod sursa (job #447310) | Cod sursa (job #2807929) | Cod sursa (job #1598659) | Cod sursa (job #3139550) | Cod sursa (job #890023)
Cod sursa(job #890023)
#include<fstream>
#include<string.h>
#include<vector>
#include<queue>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int D[2005];
struct cmp
{
bool operator() (const int &a, const int &b)
{
return (D[a]>D[b]);
}
};
int t,i,j,nod,nod2,n,m,k,x,y,c,X[20],sol[20][20],B[20][1<<18];
vector<pair<int,int> > a[2005];
priority_queue<int,vector<int>,cmp> Q;
vector<pair<int,int> >::iterator it;
void dijkstra(int nod)
{
D[nod]=0;
Q.push(nod);
while (!Q.empty())
{
nod=Q.top();
for (it=a[nod].begin();it!=a[nod].end();it++)
{
nod2=(*it).first;
if (D[nod] + (*it).second < D[nod2])
{
D[nod2]=D[nod]+(*it).second;
Q.push(nod2);
}
}
Q.pop();
}
}
int main()
{
in>>n>>m>>k;
for (i=1;i<=k;i++)
in>>X[i];
X[k+1]=n;
k+=1;
for (i=1;i<=m;i++)
{
in>>x>>y>>c;
a[x].push_back(make_pair(y,c));
a[y].push_back(make_pair(x,c));
}
memset(D,0x3f3f3f3f,sizeof(D));
dijkstra(1);
for (j=1;j<=k;j++)
B[j][1<<(j-1)]=D[X[j]];
for (i=1;i<=k;i++)
{
memset(D,0x3f3f3f3f,sizeof(D));
dijkstra(X[i]);
for (j=1;j<=k;j++)
sol[i][j]=D[X[j]];
}
B[0][0]=0;
for (i=1;i<=(1<<k)-1;i++)
for (j=1;j<=k;j++)
if ((i & (1<<(j-1))) && (i-(1<<(j-1))))
{
B[j][i]=0x3f3f3f3f;
for (t=1;t<=k;t++)
if (i & (1<<(t-1)) && j!=t)
B[j][i]=min(B[j][i],B[t][i-(1<<(j-1))] + sol[t][j]);
}
out<<B[k][(1<<k)-1];
}