Cod sursa(job #2935546)

Utilizator mmocanuMocanu Mihai-Adrian mmocanu Data 6 noiembrie 2022 21:17:34
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <stack>
#define MAXK 17
#define MAXN 2003
using namespace std;

struct XYC{
  int x,y,c;
};

struct XC{
  int node,cost;
};

vector <XC> graf[MAXN];
vector <XC> arbo[MAXN];
queue <int> q;
int dina[MAXK][1<<MAXK];
int dist[MAXN];
int prit[MAXK];
int n,mi,k;

void AddEdge(XYC a){
  graf[a.x].push_back({a.y,a.c});
  graf[a.y].push_back({a.x,a.c});
}

void DFS(int mask){
  int node;
  for(node=0;node<k;node++){
    if(dina[node][mask]!=0){
      for(XC neigh : arbo[node]){
        if((mask&(1<<neigh.node))==0){
          if(dina[node][mask]+neigh.cost<dina[neigh.node][mask+(1<<neigh.node)] || dina[neigh.node][mask+(1<<neigh.node)]==0){
            dina[neigh.node][mask+(1<<neigh.node)]=dina[node][mask]+neigh.cost;
          }
        }
      }
    }
  }
}

void BFS(int poz){
  int i,node;
  node=prit[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(XC neigh : graf[node]){
      if(dist[neigh.node]==-1 || dist[neigh.node]>dist[node]+neigh.cost){
        dist[neigh.node]=dist[node]+neigh.cost;
        q.push(neigh.node);
      }
    }
  }
  for(i=0;i<k;i++){
    if(prit[poz]!=prit[i]){
      arbo[poz].push_back({i,dist[prit[i]]});
    }
  }
}

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

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

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

  dina[0][1]=1;
  for(i=1;i<(1<<k);i++){
    DFS(i);
  }

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

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