Cod sursa(job #2511071)

Utilizator armigheGheorghe Liviu Armand armighe Data 18 decembrie 2019 01:47:20
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<fstream>
#include<vector>
#include<algorithm>
#include<queue>
#define INF 2000000000
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
struct elem
{
    int x,c;
    bool operator < (const elem &a) const
    {
        return c>a.c;
    }
};
vector<elem>a[50002];
priority_queue<elem>pq;
int v[20],d[20][2002],n,viz[2002],dp[20][132002];

void dijkstra(int s)
{
    int i,l;
    elem p;
    for(i=1;i<=n;i++)
    if(i!=v[s])
        d[s][i]=INF;
    p.x=v[s];
    p.c=0;
    pq.push(p);
    while(!pq.empty())
    {
        p=pq.top();
        pq.pop();
        l=a[p.x].size();
        for(i=0;i<l;i++)
        if(d[s][a[p.x][i].x]>d[s][p.x]+a[p.x][i].c)
        {
            d[s][a[p.x][i].x]=d[s][p.x]+a[p.x][i].c;
            pq.push(elem{a[p.x][i].x,d[s][a[p.x][i].x]});
        }
    }
}

int main()
{
    int m,k,i,x,y,z,p=1,stare,j;
    f>>n>>m>>k;
    for(i=1;i<=k;i++)
        f>>v[i];
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        a[x].push_back({y,z});
        a[y].push_back({x,z});
    }
    v[0]=1;
    v[k+1]=n;
    for(i=0;i<=k+1;i++)
        dijkstra(i),p*=2;
    p--;
    for(i=0;i<=p;i++)
    for(j=0;j<=k+1;j++)
        dp[j][i]=INF;
    dp[0][1]=0;
    for(stare=1;stare<p;stare++)
    {
        for(i=0;i<=k+1;i++)
        if((stare&(1<<i))!=0)
        if(dp[i][stare]!=INF)
        {
                for(j=0;j<=k+1;j++)
                if((stare&(1<<j))==0)
                    dp[j][(stare|(1<<j))]=min(dp[j][(stare|(1<<j))],dp[i][stare]+d[i][v[j]]);
        }
    }
    g<<dp[k+1][p];
    return 0;
}