Pagini recente » Cod sursa (job #918368) | Cod sursa (job #1934143) | Cod sursa (job #268868) | Cod sursa (job #1545430) | Cod sursa (job #704852)
Cod sursa(job #704852)
#include <vector>
#include <fstream>
#include <queue>
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
using namespace std;
vector<pair<int,int> > v[2002];
vector<int> w[20];
priority_queue< pair<int,int>,vector<pair<int,int> >,greater< pair<int,int> > > q;
int n,k,m,imp[20],cost[2002],a[20][20],j,x,y,c,cc[1<<20][20];
int chcm(int conf,int last)
{
if(!cc[conf][last])
{cc[conf][last]=1000000000;
for(int i=0;i<w[last].size();i++)
if(conf&(1<<w[last][i]))
{ if(w[last][i]||conf==(1<<last)+1)
cc[conf][last]=min(cc[conf][last],chcm(conf^(1<<last),w[last][i])+a[w[last][i]][last]);
}}
if(cc[conf][last]==-1)
return 0;
else
return cc[conf][last];
}
int main ()
{int i;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
f>>n>>m>>k;
for(i=0;i<=k+1;i++)
for(j=0;j<=k+1;j++)
a[i][j]=1000000000;
for(i=1;i<=k;i++)
f>>imp[i];
while(m)
{f>>x>>y>>c;
v[x].pb(mp(c,y));
v[y].pb(mp(c,x));
m--;}
imp[0]=1;
imp[k+1]=n;
for(i=0;i<=k;i++)
{cost[imp[i]]=-1;
for(j=0;j<v[imp[i]].size();j++)
q.push(v[imp[i]][j]);
while(!q.empty())
{
if(!cost[q.top().second])
{
x=q.top().second;
cost[x]=q.top().first;
q.pop();
for(j=0;j<v[x].size();j++)
if(!cost[v[x][j].second])
{v[x][j].first+=cost[x];
q.push(v[x][j]);
v[x][j].first-=cost[x];}
}
else
q.pop();
}
cost[imp[i]]=0;
for(j=0;j<=k+1;j++)
{a[i][j]=cost[imp[j]];}
for(j=1;j<=n;j++)
cost[j]=0;
}
k+=2;
for(i=0;i<k;i++)
for(j=0;j<k;j++)
if(a[i][j])
w[j].pb(i);
cc[1][0]=-1;
g<<chcm((1<<k)-1,k-1);
f.close(); g.close();
return 0;
}