Cod sursa(job #1592124)

Utilizator lflorin29Florin Laiu lflorin29 Data 7 februarie 2016 01:19:49
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <bits/stdc++.h>

using namespace std;

class muchie {
 public:
     int unde, cost;
     muchie(int unde = 0, int cost = 0) :
         unde(unde), cost(cost) {};
};

constexpr static int inf  = numeric_limits<int>::max() / 4;

vector<int>cities;
vector<bool>is_c;
int n, m, k;
int mask;
int indice[2048];

struct stare{
 int nod, mask,acts;
 stare(int nod = 0, int mask = 0):
     mask(mask), nod(nod){};
};

using PII = pair<int, int>;

class graf
{
  private:
      constexpr static int nr_noduri = 2048;
      vector<muchie>muc[nr_noduri];
      unordered_map<int, int>dp[nr_noduri];
public:
    graf(int n = 0,int k=0) {
    }

    void add(int x, int y, int cost) {
        muc[x].push_back(muchie(y, cost));
        muc[y].push_back(muchie(x, cost));
    }

    void solve() {
        auto cmp = [&] (const stare&a, const stare &b){
            return dp[a.nod][a.mask]>dp[b.nod][b.mask];
        };

       priority_queue<stare,vector<stare>,decltype(cmp)>q(cmp);
       //stare ii nod,mask
       int actnod=0,actmask=0;
       if(is_c[0])actmask|=1<<indice[0];
       q.push(stare(actnod,actmask));
       vector<vector<bool>>viz(n, vector<bool>(1<<k));
       dp[0][actmask] = 0;
       while(!q.empty())
       {
           auto emp = q.top();
           q.pop();
           int maska=emp.mask,nod=emp.nod, ce_cost = dp[nod][maska];
           viz[nod][maska]=0;
           for(auto vec : muc[nod])
           {
               int nc=vec.cost+ce_cost,nod_nou=vec.unde;
               int new_mask=maska;
               if(is_c[nod_nou])new_mask|=1<<indice[nod_nou];
               if(dp[nod_nou].find(new_mask)!=end(dp[nod_nou]) && nc>=dp[nod_nou][new_mask])continue;
               dp[nod_nou][new_mask]=nc;

               if(viz[nod_nou][new_mask])continue;
               viz[nod_nou][new_mask]=1;
               q.push(stare(nod_nou, new_mask));
           }
       }

       ofstream("ubuntzei.out") <<dp[n-1][mask];

    }
};

graf G;
void read() {
    ifstream cin("ubuntzei.in");
    cin >> n >> m >> k;
    cities.resize(k), is_c.resize(n);
    G = graf(n,k);
    for(int i = 0; i < k; ++i) {
        cin >> cities[i];
        cities[i]--;
        is_c[cities[i]] = 1;
        indice[cities[i]]=i;
        mask |= 1<<i;
    }

    for(int i = 0; i < m; ++i) {
       int a, b, cost;
       cin >> a >> b >> cost;
       a--; b--;
       G.add(a, b, cost);
    }
}


int main() {
    read();
    G.solve();
    return 0;
}