Cod sursa(job #1618763)

Utilizator danyro364Savu Ioan Daniel danyro364 Data 27 februarie 2016 23:39:14
Problema Ubuntzei Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <cstdio>
#include <vector>
#include <queue>
#define inf 1<<30
#define nmax 2001
#define kmax 18
using namespace std;
FILE *f=fopen("ubuntzei.in","r"),*g=fopen("ubuntzei.out","w");
struct muc{
    int d,c;
};
int n,k,v[kmax],d[nmax][nmax],t,D[kmax][kmax],best[1<<(kmax+1)][kmax];
vector <muc> l[nmax];
struct cmp{
    int operator()(int x, int y)
    {
        return d[t][x]>d[t][y];
    }
};
priority_queue <int, vector <int>, cmp> q;
int memo(int biti, int nod)
{
    if(best[biti][nod]!=0)
        return best[biti][nod];
    if(biti==1)
        return d[v[nod]][v[0]];
        int val=inf,i;
    for(i=0;i<=k;i++)
    {
        /*if(i==0&&biti==1)
            val= d[v[nod]][v[0]];
        else */if(biti&(1<<i))
            val=min(val,memo(biti xor 1<<i,i)+d[v[nod]][v[i]]);

    }
    best[biti][nod]=val;
    return val;
}
int main()
{
    int i,j,m,x,y,mini=inf; muc aux;
    fscanf(f,"%d %d",&n,&m);
    fscanf(f,"%d",&k);
    for(i=1;i<=k;i++)
        fscanf(f,"%d",&v[i]);
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d %d %d",&x,&y,&aux.c);
        aux.d=y;
        l[x].push_back(aux);
        aux.d=x;
        l[y].push_back(aux);
    }
    v[0]=n;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i!=j)
            d[i][j]=inf;
    for(t=0;t<=k;t++)
    {
        q.push(v[t]);
        while(!q.empty())
        {
            x=q.top(); q.pop();
            for(i=0;i<l[x].size();i++)
            {
                y=l[x][i].d;

                if(d[v[t]][y]>d[v[t]][x]+l[x][i].c)
                {
                    d[v[t]][y]=d[v[t]][x]+l[x][i].c;
                    d[y][v[t]]=d[v[t]][y];
                     q.push(y);
                }
            }
        }
    }
    for(i=1;i<=k;i++)
    {
        mini=min(mini,memo((1<<(k+1))-1 xor 1<<i,i)+d[v[i]][1]);
    }
    if(k==0)
        mini=d[n][1];
    fprintf(g,"%d\n",mini);
    fclose(f);
    fclose(g);

    return 0;
}