Cod sursa(job #1117482)

Utilizator TodeaDariustodea darius TodeaDarius Data 23 februarie 2014 16:14:58
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include<cstdio>
#include<vector>
#include<queue>
#define nrmare 1999999999
using namespace std;
int n,m,k[20],kk,dist[20][2005],viz[2005],nr,sol[1<<17][20];
//bool ex[20][20],eink[2005];
struct point
{
    int p,ct;
};
vector<point>v[2005];
queue<int>q;
point makenod(int y,int z)
{
    point t;
    t.p=y;
    t.ct=z;
    return t;
}
void citire()
{
    int x,y,z;
    scanf("%d%d",&n,&m);
    scanf("%d",&kk);
    k[1]=1;
    for(int i=2;i<=kk+1;i++)
       scanf("%d",&k[i]);
    k[kk+2]=n;

    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        v[x].push_back(makenod(y,z));
        v[y].push_back(makenod(x,z));
    }
}
void dijkstra(int x)
{
    while(!q.empty())
    {
        x=q.front();
        for(int i=0;i<v[x].size();i++)
        {
            if(dist[nr][x]+v[x][i].ct<dist[nr][v[x][i].p])
            {
                dist[nr][v[x][i].p]=dist[nr][x]+v[x][i].ct;
                if(viz[v[x][i].p]==0)
                {
                    q.push(v[x][i].p);
                    viz[v[x][i].p]=1;
                }
            }
        }
        viz[x]=0;
        q.pop();
    }
}
void mare1()
{
    for(int i=1;i<=kk+2;i++)
        for(int j=1;j<=n;j++)
            if(k[i]!=j)
                dist[i][j]=nrmare;
            else
                dist[i][j]=0;
}
void mare2()
{
    for(int i=1;i<=n;i++)
        viz[i]=0;
}
void mare3()
{
    for(int i=1;i<=((1<<17)-1);i++)
        for(int j=1;j<=kk+2;j++)
            sol[i][j]=nrmare;
    for(int i=1;i<=kk+2;i++)
        sol[1<<(i-1)][i]=0;
}
int main()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);

    citire();
    mare1();
    for(nr=1;nr<=kk+2;nr++)
    {
        mare2();
        q.push(k[nr]);
        viz[k[nr]]=1;
        dijkstra(k[nr]);
    }
    if (k == 0)
    {
        printf("%d\n",dist[0][n]);
        return 0;
    }
    sol[1][1]=0;
    mare3();
    for(int i=2;i<=(1<<(kk+2))-1;i++)
        for(int j=1;j<=kk+2;j++)
        {
           if((i & (1<<(j-1)))!=0)
           {
                    for(int t=1;t<=kk+2;t++)
                        {
                                if(k[j]!=k[t] && (i & (1<<(t-1)))!=0)
                                    if(sol[i][j]>sol[i^(1<<(j-1))][k[t]]+dist[t][k[j]])
                                        sol[i][j]=sol[i^(1<<(j-1))][k[t]]+dist[t][k[j]];
                        }
           }
        }
    printf("%d",sol[(1<<(kk+2))-1][kk+2]);
    return 0;
}