Cod sursa(job #2130398)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 13 februarie 2018 17:50:52
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <deque>

#define INF 2140000000
#define MOD 1000000007
#define MaxN 2005
#define MaxK 16

using namespace std;

FILE*IN=fopen("ubuntzei.in","r"),*OUT=fopen("ubuntzei.out","w");

int dist[MaxK][MaxK],depth[MaxN],d[MaxK][1<<MaxK],spec[MaxK],N,M,K;
vector <pair<int,int> >Graph[MaxN];
queue<int> Q;
void BFS(int node)
{
    for(int i=1;i<=N;i++)
        depth[i]=INF;
    depth[node]=0;
    Q.push(node);
    while(!Q.empty())
    {
        node=Q.front();
        Q.pop();
        for(int i=0;i<Graph[node].size();i++)
        {
            if(depth[Graph[node][i].first]>Graph[node][i].second+depth[node])
            {
               depth[Graph[node][i].first]=Graph[node][i].second+depth[node];
               Q.push(Graph[node][i].first);
            }
        }
    }
}
int main()
{
    fscanf(IN,"%d%d%d",&N,&M,&K);
    for(int i=0;i<K;i++)
        fscanf(IN,"%d",&spec[i]);
    for(int i=1;i<=M;i++)
    {
        int X,Y,Z;
        fscanf(IN,"%d%d%d",&X,&Y,&Z);
        Graph[X].push_back({Y,Z});
        Graph[Y].push_back({X,Z});
    }
    BFS(1);
    if(K==0)
    {
        fprintf(OUT,"%d",depth[N]);
        return 0;
    }
    for(int i=0;i<K;i++)
        d[i][1<<i]=depth[spec[i]];
    for(int i=0;i<K;i++)
    {
        BFS(spec[i]);
        for(int j=0;j<K;j++)
            dist[i][j]=depth[spec[j]];
    }
    for(int i=1;i<(1<<K);i++)
        for(int j=0;j<K;j++)
        {
            if((1<<j)&i)
            {
                if((1<<j)^i)
                    d[j][i]=INF;
                int p=i^(1<<j);
                for(int k=0;k<K;k++)
                    if((1<<k)&p)
                        d[j][i]=min(d[j][i],dist[j][k]+d[k][p]);
            }
        }
    BFS(N);
    for(int i=0;i<K;i++)
        d[i][(1<<K)-1]+=depth[spec[i]];
    int Min=INF;
    for(int i=0;i<K;i++)
        Min=min(Min,d[i][(1<<K)-1]);
    fprintf(OUT,"%d",Min);
    return 0;
}