Cod sursa(job #704852)

Utilizator bacilaBacila Emilian bacila Data 2 martie 2012 21:13:02
Problema Ubuntzei Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#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;
}