Cod sursa(job #1127829)

Utilizator macajouMaca George macajou Data 27 februarie 2014 14:00:15
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <cstdio>
#include <vector>
#include <queue>
#define nmax 2010
#define kmax 20
#define inf 1<<30

using namespace std;

struct vecin
{
    int vec,c;
    vecin(int vec=0, int c=0):vec(vec),c(c)
    {

    }
};



int k,n,m,dij,cost[nmax][nmax],a[kmax][1<<kmax],loc[kmax],ct;
vector<vecin> v[nmax];

struct cmp
{
    bool operator()(const int& a, const int &b)
    {
        return cost[dij][a]>cost[dij][b];
    }
};

priority_queue<int,vector<int>,cmp> q;

void citire()
{
    int i,x,y,j,c;
    scanf("%d%d%d",&n,&m,&k);
    loc[1]=1;
    ct=1;
    for(i=1;i<=k;i++)
        {
            scanf("%d",&x);
            loc[++ct]=x;
        }
    loc[++ct]=n;
    for(i=1;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&c);
            v[x].push_back(vecin(y,c));
            v[y].push_back(vecin(x,c));
        }
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            cost[i][j]=inf;
}

void dijkstra()
{
    int i,p;
    vecin vc;
    q.push(dij);
    cost[dij][dij]=0;
    while(!q.empty())
          {
              p=q.top();
              q.pop();
              for(i=0;i<v[p].size();i++)
                  {
                      vc=v[p][i];
                      if(cost[dij][p]+vc.c<cost[dij][vc.vec])
                         {
                             cost[dij][vc.vec]=cost[dij][p]+vc.c;
                             q.push(vc.vec);
                         }
                  }
          }
}

int minim(int a, int b)
{
    if(a<b)
       return a;
    return b;
}

int rez(int x, int y)
{
    int i,xx;
    if(a[x][y]==0)
       {
           a[x][y]=inf;
           for(i=1;i<=k;i++)
            if(i!=x)
               a[x][y]=minim(a[x][y],rez(i,y-(1<<x))+cost[loc[i]][loc[x]]);
       }
    return a[x][y];
}

int main()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);

    int i,x;
    citire();
    for(i=1;i<=ct;i++)
        {
            dij=loc[i];
            dijkstra();
        }
    k+=2;
    for(i=1;i<=k;i++)
        {
            //x=loc[i];
            a[i][(1<<x)+1]=cost[loc[1]][loc[i]];
        }
    printf("%d",rez(k-1,(1<<(k))-1));

    return 0;
}