Cod sursa(job #1982303)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 18 mai 2017 10:22:29
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream in ("ubuntzei.in");
ofstream out ("ubuntzei.out");
int const kmax = 16;
int const nmax = 2000;
int const inf = 1000000000;

int n ,m ,k;
int w[5 + kmax];

struct muchie{
  int x;
  int y;
  int cost;
};
vector <muchie> edge;
vector <vector <int>> v;
int cost[5 + kmax][5 + kmax];
int d[5 + nmax];

queue <int> q;
void computepaths(int node){
  q.push(node);
  for(int i = 0 ; i <= nmax ;i++){
    d[i] = inf;
  }
  d[node] = 0;
  while(0 < q.size()){
    node = q.front();
    q.pop();
    for(int i = 1 ; i < v[node].size() ;i++){

      if(d[node] + edge[v[node][i]].cost < d[edge[v[node][i]].x + edge[v[node][i]].y - node]){
        d[edge[v[node][i]].x + edge[v[node][i]].y - node] = d[node] + edge[v[node][i]].cost;

        q.push(edge[v[node][i]].x + edge[v[node][i]].y - node);
      }
    }
  }
}
int const ultimatestate = (1<<(kmax + 1));

int dp[ultimatestate][5 + kmax];

int main()
{
  in>>n>>m;
  in>>k;
  w[0] = 1;
  for(int i = 1 ; i <= k ;i++){
    in>>w[i];
  }
  vector <int> temp;
  temp.push_back(0);
  for(int i = 0 ; i <= n ;i++){
    v.push_back(temp);
  }

  k++;
  w[k] = n;
  edge.push_back({0 ,0 ,0});
  int x ,y ,a;

  for(int i = 1 ; i <= m ;i++){
    in>>x>>y>>a;
    edge.push_back({x ,y , a});
    v[x].push_back(i);
    v[y].push_back(i);
  }

  for(int i = 0 ; i <= k ;i++){
    computepaths(w[i]);
    for(int j = 0 ; j <= k ;j++){
      cost[i][j] = d[w[j]];
    }
  }

  int statemax = (1 << (k + 1));
  for(int i = 0 ; i < statemax;i++){
    for(int j = 0 ; j <= k ;j++){
      dp[i][j] = inf;
    }
  }
  dp[1][0] = 0;

  for(int state = 1 ; state < statemax ;state++){
    for(int i = 0 ;i <= k ;i++){
      if(dp[state][i] != inf){///daca am fost in i cu starea state
        for(int j = 0 ; j <= k ;j++){
          if((state & (1<<j)) == 0){
            dp[(state | (1<<j))][j] = min(dp[(state | (1<<j))][j] , dp[state][i] + cost[i][j]);
          }
        }
      }
    }
  }
  out<<dp[statemax - 1][k];
  return 0;
}