Cod sursa(job #3292617)

Utilizator cosminccc7Cazacu Cosmin cosminccc7 Data 8 aprilie 2025 19:00:44
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include<bits/stdc++.h>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n,m,x,y,z,k;
int inf=2e9;
int nr[2001];
vector<vector<int>>dp(70000,vector<int>(21,inf));
vector<bool>parcurs;
vector<int>obl;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
vector<vector<int>>distanta(2000,vector<int>(2000,inf));
vector<vector<pair<int,int>>>muchii(2000);
int main()
{in>>n>>m;
in>>k;
obl.push_back(0);
for(int i=1;i<=k;i++)
    {in>>x, obl.push_back(x-1);
        nr[x-1]=i;}

k++;
   for(int i=1;i<=m;i++)
   {in>>x>>y>>z;
   muchii[x-1].push_back(make_pair(y-1,z));
   muchii[y-1].push_back(make_pair(x-1,z));
   }
  for(int i=0;i<n;i++)
  distanta[i][i]=0;
   for(int i=0;i<k;i++)
   {pq.push(make_pair(0,obl[i]));
   while(!pq.empty())
   {int nod=pq.top().second;
       pq.pop();
       for(auto x:muchii[nod])
       {int nod1=x.first,cost1=x.second;
       if(distanta[obl[i]][nod1]>distanta[obl[i]][nod]+cost1)
       {distanta[obl[i]][nod1]=distanta[obl[i]][nod]+cost1;
           pq.push(make_pair(distanta[obl[i]][nod1],nod1));
       }
       }
   }
   }
   vector<vector<pair<int,int>>>drum(k,vector<pair<int,int>>(0));
   for(int i=0;i<k;i++)
   for(int j=0;j<k;j++)
   if(i!=j&&distanta[obl[i]][obl[j]]!=inf)
   drum[i].push_back(make_pair(j,distanta[obl[i]][obl[j]]));



  dp[1][0]=0;
  for(int mask=3;mask<(1<<k);mask+=2)
  for(int i=1;i<k;i++)
   if(mask&(1<<i))
   for(auto x:drum[i])
   dp[mask][i]=min(dp[mask][i],dp[mask^(1<<i)][x.first]+x.second);
   int rezultat=inf;
    for(int i=0;i<k;i++)
    rezultat=min(rezultat,dp[(1<<k)-1][i]+distanta[obl[i]][n-1]);
    out<<rezultat;
  //  out<<endl;
//for(int i=0;i<n;i++)
//{for(int j=0;j<n;j++)out<<distanta[i][j]<<" ";
//out<<endl;}
}