Cod sursa(job #1650882)

Utilizator elevenstrArina Raileanu elevenstr Data 11 martie 2016 21:18:09
Problema Ubuntzei Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
#define INF 9999999999
struct muc
{
    int y,c;
} A[10008];
vector <muc> v[2011];
long long n,m,k,viz[18],a,b,cost,dp[1<<18][19],lt,d[2011],mat[20][20];
queue <int> Q;
void bell(int nod)
{
    for(int i=1; i<=n; i++)
        d[i]=-1;
    d[nod]=0;
    Q.push(nod);
    while(!Q.empty())
    {
        int x=Q.front();
        Q.pop();
        for(int i=0; i<v[x].size(); i++)
            if(d[v[x][i].y]==-1||d[v[x][i].y]>d[x]+v[x][i].c)
            {
                d[v[x][i].y]=d[x]+v[x][i].c;
                Q.push(v[x][i].y);
            }
    }
}
int main()
{
    in>>n>>m;
    in>>k;
    for(int i=1; i<=k; i++)
        in>>viz[i];
    while(m--)
    {
        in>>a>>b>>cost;
        v[a].push_back({b,cost});
        v[b].push_back({a,cost});
    }
    int lt=k+2;
    bell(1);
    for(int j=1; j<=k; j++)
        mat[0][j]=mat[j][0]=d[viz[j]];
    mat[0][k+1]=mat[k+1][0]=d[n];
    for(int i=1; i<=k; i++)
    {
        bell(viz[i]);
        for(int j=1; j<=k; j++)
            mat[i][j]=mat[j][i]=d[viz[j]];
        mat[i][k+1]=mat[k+1][i]=d[n];
        mat[0][i]=mat[i][0]=d[1];
    }
    bell(n);
    for(int j=1; j<=k; j++)
        mat[k+1][j]=mat[j][k+1]=d[viz[j]];
    mat[0][k+1]=mat[k+1][0]=d[1];
    for(int i=1; i<=n; i++)
        if(k==0)
        {
            out<<d[n];
            return 0;
        }
    for(int i=0; i<=(1<<lt); i++)
        for(int j=0; j<=lt; j++)
            dp[i][j]=INF;
   dp[1][0]=0;
    for(int i=0; i<(1<<lt); i++)
        for(int j=0; j<lt; j++)
            if(i&(1<<j))
                for(int k=0; k<lt; k++)
                    if(i&(1<<k))
                        if(dp[i][j]==-1)dp[i][j]=dp[i-(1<<j)][k]+mat[j][k];
                        else dp[i][j]=min(dp[i][j],dp[i-(1<<j)][k]+mat[j][k]);
    out<<dp[(1<<lt)-1][k+1];

    return 0;
}