Cod sursa(job #3193143)

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

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

long long D[N][33000];
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,int> > >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]));
    }
    coada.push(x);D[r][0]=0;

    while(!coada.empty())
    {

        x=coada.top();
        coada.pop();

        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));
   }

   dijkstra(1);
   g<<D[n][nrs]<<" ";

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

    return 0;
}