Cod sursa(job #1618649)

Utilizator danyro364Savu Ioan Daniel danyro364 Data 27 februarie 2016 22:12:05
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 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[kmax][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==0)
        return 0;
        int val=inf,i;
    for(i=0;i<=k;i++)
    {
        if(i==0&&biti==1)
            val=D[nod][k];
        else if(biti&(1<<i))
            val=min(val,memo(biti xor 1<<i,i)+D[nod][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);
    }
    k++;
    v[0]=1; v[k]=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;
                     q.push(y);
                }
            }
        }
    }
    for(i=0;i<=k;i++)
        for(j=0;j<=k;j++)
        D[i][j]=d[v[i]][v[j]];

    for(i=1;i<=k;i++)
    {
        mini=min(mini,memo((1<<(k+1))-1 xor 1<<i,i)+D[0][i]);
    }
    fprintf(g,"%d\n",mini);
    fclose(f);
    fclose(g);

    return 0;
}