Cod sursa(job #1891610)

Utilizator hasmasandragosHasmasan Dragos hasmasandragos Data 24 februarie 2017 10:39:44
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

const int nmax=205;
const int logmax=((1<<15)-1)+5;

int n,m,k;
int stops[nmax];
int cost[nmax][logmax];
vector <pair <int,int> > graf[nmax]; /// nod , cost
priority_queue <pair <int, pair<int,int> > , vector < pair <int, pair<int,int> > > , greater < pair <int, pair <int,int> > > > cod; /// cost , nod , stare

void dijkstra()
{
    int i,nodac,confac,costac,vecini,nodnou,costnou,copieconf;
    cost[1][0]=0;
    cod.push(make_pair(0,make_pair(1,0)));

    while (!cod.empty())
    {
        costac=cod.top().first;
        nodac=cod.top().second.first;
        confac=cod.top().second.second;
        copieconf=confac;
        cod.pop();
        //g<<costac<<" "<<nodac<<" "<<confac<<'\n';

        vecini=graf[nodac].size();

        for (i=0;i<vecini;i++)
        {
            confac=copieconf;
            nodnou=graf[nodac][i].first;
            costnou=graf[nodac][i].second;

            if (stops[nodnou]!=0)
            {
                confac=( (confac) | (1<<(stops[nodnou]-1)) );
            }

            if (costnou+costac<cost[nodnou][confac])
            {
                cost[nodnou][confac]=costnou+costac;
                cod.push(make_pair(costnou+costac,make_pair(nodnou,confac)));

                //g<<costnou+costac<<" "<<nodac<<">"<<nodnou<<" "<<confac<<'\n';
            }
        }
    }
}

int main()
{
  int i,j,x,y,costac,nrfriends=0;

  f>>n>>m;

  for (i=1;i<=n;i++)
    for (j=1;j<=logmax;j++)
     cost[i][j]=INT_MAX;

   f>>k;
   for (i=1;i<=k;i++)
   {
     f>>x;
     stops[x]=i;
   }

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

   dijkstra();
/*
   for (i=1;i<=n;i++)
   {
       for (j=0;j<=1;j++)
        g<<cost[i][j]<<" ";
       g<<'\n';
   }
*/
   g<<cost[n][(1<<k)-1];

   return 0;
}