Cod sursa(job #1348106)

Utilizator danyro364Savu Ioan Daniel danyro364 Data 19 februarie 2015 15:24:47
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
#include <algorithm>
#define nmax 2001
#define kmax 16
#define inf 1<<30
using namespace std;
FILE *f=fopen("ubuntzei.in","r"),*g=fopen("ubuntzei.out","w");
struct muc{
    int c,d;
};
int best[1<<kmax][nmax],n,v[kmax+1],a[nmax][nmax],nod,k;
struct comp{
    int operator()(int x, int y)
    {
        return a[nod][x]>a[nod][y];
    }
};
vector <muc> l[nmax];
priority_queue <int, vector <int>, comp> q;
void dij()
{
    int i,j,x;
    q.push(nod);
    for(i=1;i<=n;i++)
        a[nod][i]=inf;
    a[nod][nod]=0;
    while(!q.empty())
    {
        x=q.top();
        q.pop();
        for(i=0;i<l[x].size();i++)
        {
            j=l[x][i].d;
            if(a[nod][j]>a[nod][x]+l[x][i].c)
            {
                a[nod][j]=a[nod][x]+l[x][i].c;
                q.push(j);
            }
        }

    }
}
int drum(int conf, int x)
{
    if(best[conf][x]!=0)
        return best[conf][x];
    if(conf==0)
        return 0;
    int i,j,p;
    for(i=0;i<=k;i++)
    {
        if(i>0)
        {if(conf&1<<i)
            best[conf][x]=min(best[conf][x],best[conf xor 1<<i][v[i]]+a[x][v[i]]);}
        else if(i==0&&conf==1)
            best[conf][x]=a[x][v[i]];
    }
    return best[conf][x];
}
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);
    }
    nod=1; dij();
    if(k==0)
    {
        fprintf(g,"%d",a[1][n]);
        fclose(f);
        fclose(g);
        return 0;
    }
    for(i=1;i<=k;i++)
    {
        nod=v[i];
        dij();
    }
    v[0]=n;
    for(i=1;i<=k;i++)
    {
        x=drum((1<<(k+1))-1 xor 1<<i,v[i])+a[1][v[i]];
        if(x<mini)
            mini=x;
    }
    fprintf(g,"%d",mini);
    fclose(f);
    fclose(g);
    return 0;
}