Cod sursa(job #1227562)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 10 septembrie 2014 20:26:38
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
struct sp
{
    int no,co;
    const bool operator <(const sp & other)
   const {
        return co>other.co;
         }
};
const int SOLM=400000000;
vector<sp> li[2005],ili[2005];
int p2[20],sec[30],dist[30][30],k,dtm[2005],po[2005],din[16][1<<16];
bool be[2005];
priority_queue <sp> pq;
void djk(int nod)
{
    int i;
    sp tmp,tm2;
    tmp.no=nod;
    tmp.co=0;
    pq.push(tmp);
    while(!pq.empty())
    {
        tmp=pq.top();
        pq.pop();
        if(be[tmp.no]==0)
        {
        be[tmp.no]=1;
        for(i=li[tmp.no].size()-1;i>=0;i--)
        {
        tm2.no=li[tmp.no][i].no;
        tm2.co=tmp.co+li[tmp.no][i].co;
        if(be[tm2.no]==0)
        {
        pq.push(tm2);
        dtm[tm2.no]=tm2.co;
        }
        }
        }
    }
}
int fct(int nod,int bm)
{
    int i,sol,x;
    if(bm==p2[nod])
    {
    din[nod][bm]=dist[k-1][nod];
    }
    if(din[nod][bm]>0)
    return din[nod][bm];
    for(i=16;i>0;i--)
    if((bm & p2[i]) && dist[i][nod]>0)
    {
        x=bm-p2[nod];
    fct(i,x);
    if(din[i][x]>0 && dist[i][nod]>0)
     sol=min(sol,din[i][x]+dist[i][nod]);
    }
    din[nod][bm]=sol;
    return sol;
}
int main()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    int n,m,i,j,bm,sol;
    sp tm;
    p2[0]=1;
    for(i=1;i<=16;i++)
    p2[i]=p2[i-1]*2;
    scanf("%d%d%d",&n,&m,&k);
    for(i=1; i<=k; i++)
    {
        scanf("%d",&sec[i]);
        po[sec[i]]=i;
    }
    bm=(1<<(k+1))-2;
    k++;
    sec[k]=1;
    po[1]=k;
    k++;
    sec[k]=n;
    po[n]=k;
    for(i=1; i<=m; i++)
    {
        scanf("%d%d%d",&j,&tm.no,&tm.co);
        li[j].push_back(tm);
    }
    for(i=1; i<=k; i++)
    {
        for(j=1;j<=n;j++)
        {
        be[j]=0;
        dtm[j]=0;
        }
        djk(sec[i]);
        for(j=1;j<=n;j++)
        dist[i][po[j]]=dtm[j];
    }
 /*   for(i=1;i<=k;i++)
    {
    for(j=1;j<=k;j++)
    printf("%d ",dist[i][j]);
    printf("\n");
    }*/
    sol=SOLM;
    for(i=k-2;i>=1;i--)
    {
        fct(i,bm);
        if(din[i][bm]>0 && dist[i][k]>0)
        sol=min(sol,din[i][bm]+dist[i][k]);
    }
    printf("%d\n",sol);
    return 0;
}