Cod sursa(job #2939497)

Utilizator albertaizicAizic Albert albertaizic Data 13 noiembrie 2022 19:16:57
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <iostream>
#include <stdio.h>
#include <vector>
#include <queue>
#include <stack>
using namespace std;

#define MAX_K 17
#define MAX_N 2003
struct drum{
  int b,c;
};
int n,mi,k;
int v[MAX_K],dist[MAX_N];
int dp[MAX_K][1<<MAX_K];
vector <drum> gr[MAX_N];
vector <drum> ar[MAX_N];
queue <int> q;
void AddEdge(int a,int b,int c){
  gr[b].push_back({a,c});
  gr[a].push_back({b,c});
}

void bfs(int poz){
  int i,node;
  node=v[poz];
  for(i=0;i<n;i++){
    dist[i]=-1;
  }
  dist[node]=0;
  q.push(node);
  while(!q.empty()){
    node=q.front();
    q.pop();
    for(drum ne : gr[node]){
      if(dist[ne.b]==-1 || dist[ne.b]>dist[node]+ne.c){
        dist[ne.b]=dist[node]+ne.c;
        q.push(ne.b);
      }
    }
  }
  for(i=0;i<k;i++){
    if(v[poz]!=v[i]){
      ar[poz].push_back({i,dist[v[i]]});
    }
  }
}

int main(){
  FILE *fin,*fout;
  int a,b,c,i,m,node;
  fin=fopen("ubuntzei.in","r");
  fout=fopen("ubuntzei.out","w");
  fscanf(fin,"%d%d%d",&n,&m,&k);

  v[0]=0;
  for(i=1;i<=k;i++){
    fscanf(fin,"%d",&v[i]);
    v[i]--;
  }
  v[k+1]=n-1;
  k+=2;

  for(i=0;i<m;i++){
    fscanf(fin,"%d%d%d",&a,&b,&c);
    a--;
    b--;
    AddEdge(a,b,c);
  }
  for(i=0;i<k;i++){
    bfs(i);
  }

  dp[0][1]=1;
  for(i=1;i<(1<<k);i++){
    for(node=0;node<k;node++){
      if(dp[node][i]!=0){
        for(drum ne : ar[node]){
          if((i&(1<<ne.b))==0){
            if(dp[node][i]+ne.c<dp[ne.b][i+(1<<ne.b)] || dp[ne.b][i+(1<<ne.b)]==0){
              dp[ne.b][i+(1<<ne.b)]=dp[node][i]+ne.c;
            }
          }
        }
      }
    }
  }

  mi=dp[k-1][(1<<k)-1];
  if(mi==0){
    fprintf(fout,"Nu exista solutie");
  }else{
    fprintf(fout,"%d",mi-1);
  }

  fclose(fin);
  fclose(fout);
  return 0;
}