Cod sursa(job #3193301)

Utilizator veveve ve veve Data 14 ianuarie 2024 14:00:19
Problema Ubuntzei Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>

#define N 205
#define pinf 66e+10
using namespace std;

long long D[N][66000];
struct Nod
{
   int nod,s;
   long long cost;
};
class Compar  //vezi priority_queue.pdf
{
 public:
 bool operator()( Nod &x, Nod &y)
 {
    if(x.cost>y.cost) return true; // ordine crscatoare
    else return false;
 }
};

priority_queue< Nod, vector< Nod >, Compar > coada;

int n,m,nrs;

vector < vector<pair<int,long long> > >L(N);
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

int sel[2005][2];

void dijkstra(int r)
{
    int i,poz,c,j,sub;

    for(i=1;i<=n;i++)
        for(j=0;j<=nrs;j++)
            D[i][j]=pinf;

    Nod x,y;
    x.cost=0;x.nod=r;x.s=0;
    if(sel[r][0])  //face parte din mult
    {
        x.s=(x.s|(1<<sel[r][1]));
        D[r][x.s]=0;
    }
    else D[r][0]=0;

     coada.push(x);

    while(!coada.empty())
    {

        x=coada.top();
        coada.pop();
        if(x.nod==n and x.s==nrs) break;
       // cout<<x.nod<<" "<<x.s<<endl;

        if(D[x.nod][x.s]==x.cost)  //daca poz e la distanta minima fata de sursa
        {

          //parcurgem lista de adiacenta a lui poz
          for(i=0;i<L[x.nod].size();i++)
          {
            sub=x.s;
            if(sel[L[x.nod][i].first][0])  //face parte din mult
            {
                sub=(sub|(1<<sel[L[x.nod][i].first][1]));
            }

            if(D[L[x.nod][i].first][sub]>D[x.nod][x.s]+L[x.nod][i].second ) //daca putem imbunatati distanta
            {
                D[L[x.nod][i].first][sub]=D[x.nod][x.s]+L[x.nod][i].second;
                y.nod=L[x.nod][i].first;
                y.cost=D[L[x.nod][i].first][sub];
                y.s=sub;
                coada.push(y);
                   //adaugam nodul si distanta imbunatatita in coada
            }
          }
        }
    }

}
int main()
{
     int x,y,c,i,k;

   f>>n>>m>>k;
   for(i=1;i<=k;i++)
   {
       f>>c;
       sel[c][0]=1;
       sel[c][1]=i;
       nrs=(nrs|(1<<i));

   }
   for(i=1;i<=m;i++)
   {
      f>>x>>y>>c;
      L[x].push_back(make_pair(y,c));
      L[y].push_back(make_pair(x,c));
   }

   dijkstra(1);

   g<<D[n][nrs]<<" ";

   f.close();
   g.close();

    return 0;
}