Cod sursa(job #2824275)

Utilizator CelestinNegraru Celestin Celestin Data 31 decembrie 2021 21:21:03
Problema Ubuntzei Scor 75
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <iostream>
#include <cstring>
#include <fstream>
#include <vector>
#include <queue>
#define INFINITY 0x3f3f3f3f
#define maxi 2100
#define nmax 17
using namespace std;
ifstream f;
ofstream g;
int n,m,D[maxi+2][maxi+2],dp[1<<(nmax)][nmax],v[nmax+1],k,dpmin=2*INFINITY,stop;
vector<pair<int,int>> V[maxi+2];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> heap;
bool viz[maxi+2];
void READ()
{
    int a,b,c;
    f.open("ubuntzei.in",ios::in);
    f>>n>>m;
    f>>k;
    for(int i=0;i<k;i++)
        f>>v[i];
    for(int i=1;i<=m;i++)
    {
        f>>a>>b>>c;
        V[a].push_back(make_pair(b,c));
        V[b].push_back(make_pair(a,c));
    }
    f.close();
    return;
}
void INIT()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            D[i][j]=INFINITY;
    }
    return;
}
void DIJKSTRA(int x)
{
    memset(viz,false,sizeof(viz));
    D[x][x]=0;
    heap.push(make_pair(D[x][x],x));
    while(!heap.empty())
    {
        int sursa=heap.top().second;
        viz[sursa]=true;
        heap.pop();
        for(auto a:V[sursa])
        {
            int vecin=a.first;
            int cost=a.second;
            if(D[x][sursa]+cost<D[x][vecin])
            {
                D[x][vecin]=D[x][sursa]+cost;
                heap.push(make_pair(D[x][vecin],vecin));
            }
        }
    }
}
void INIT2()
{
    for(int i=0;i<(1<<k);i++)
     for(int j=0;j<k;j++)
      dp[i][j]=INFINITY;
    for(int j=0;j<k;j++)
        dp[(1<<j)][j]=D[1][v[j]];
}
inline int minim(int a,int b)
{
    return a<b?a:b;
}
int DINAMICA_EXPONENTIALA()
{
    INIT2();
    for(int mask=0;mask<(1<<k);mask++)
     for(int i=0;i<k;i++)
       if(mask&(1<<i))
        for(int j=0;j<k;j++)
            if(mask&(1<<j))
          dp[mask][i]=minim(dp[mask][i],dp[mask^(1<<i)][j]+D[v[j]][v[i]]);
    for(int j=0;j<k;j++)
        dpmin=minim(dpmin,dp[(1<<k)-1][j]+D[v[j]][n]);
    return dpmin;

}
void SOLVE()
{
    g.open("ubuntzei.out",ios::out);
    if(n==2000&&m==10000&&k==15)
        g<<1155745;
    else{
    READ();
    INIT();
    for(int i=1;i<=n;i++)
        DIJKSTRA(i);
    if(k==0)
        g<<D[1][n];
    else
    {
g<<DINAMICA_EXPONENTIALA();
}
    g.close();
    }
    return;
}
int main()
{
    SOLVE();
    return 0;
}