Cod sursa(job #1113687)

Utilizator ShaDoWsiD100Rzv Rzv ShaDoWsiD100 Data 20 februarie 2014 20:15:32
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#define INF 1<<30
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k,d[16],a[20][2001],viz[2001],dp[1<<16][20],x,y,c;
vector <pair<int,int> > v[2001];
queue <int> q;
void init(){
for(int i=0;i<=k;i++)
    for(int j=1;j<=n;j++)
        a[i][j]=INF;
for(int i=0;i<=((1<<k)-1);i++)

      for(int j=0;j<k;j++)
        dp[i][j]=INF;
}

void bellmanford(int x){

   memset(viz,0,sizeof(viz));
   a[x][d[x]]=0;
   q.push(d[x]);viz[d[x]]=1;
   while(!q.empty()){
      int nod=q.front();viz[nod]=0;q.pop();
      for(int i=0;i<v[nod].size();i++)
      { int nd=v[nod][i].first;
      int ct=v[nod][i].second;
          if(a[x][nd]>a[x][nod]+ct){
            a[x][nd]=a[x][nod]+ct;
            if(viz[nd]==0){
                q.push(nd);
                viz[nd]=1;
            }

          }
      }


   }


}
int main()
{
    f>>n>>m>>k;
    for(int i=0;i<k;i++)
        f>>d[i];
    d[k]=1;
    for(int i=1;i<=m;i++){
        f>>x>>y>>c;
        v[x].push_back(make_pair(y,c));
        v[y].push_back(make_pair(x,c));
    }
    init();
    for(int i=0;i<=k;i++)
        bellmanford(i);
if(k==0){
  g<<a[k][n];
  return 0;

}
  for(int i=0;i<k;i++)
    dp[1<<i][i]=a[k][d[i]];
 for(int i=1;i<=((1<<k)-1);i++) {

    for(int j=0;j<k;j++)
       if((i&(1<<j))!=0){
          if((i^(1<<j))==0)
             continue;
           for(int t=0;t<k;t++)
              if(t!=j&&(i&(1<<t))!=0)
                 if(dp[i^(1<<j)][t]!=INF&&dp[i][j]>dp[i^(1<<j)][t]+a[t][d[j]])
                     dp[i][j]=dp[i^(1<<j)][t]+a[t][d[j]];
       }
 }
     int Min=INF;
       for(int i=0;i<k;i++)
        if(dp[(1<<k)-1][i]+a[i][n]<Min)
           Min=dp[(1<<k)-1][i]+a[i][n];

 g<<Min;

    return 0;
}