Cod sursa(job #2030271)

Utilizator CodrinsahCotarlan Codrin Codrinsah Data 1 octombrie 2017 13:32:41
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>
#define lgmax 2000000001
using namespace std;
ifstream fi ("ubuntzei.in");
ofstream fo ("ubuntzei.out");

int nroras,nrdrum,kcheie,mini,sol;
int localitate[17],distanta[2005],drummin[2005][2005],fr[2005];

struct coada{int nod,dist;};
struct cmp
{
  bool operator()(coada a,coada b)
  {
    return (a.dist>b.dist);
  }
};
priority_queue<coada,vector<coada>,cmp> pq;
bitset<2005> viz;
vector<int> drum[2005],lg[2005];
void citire()
{
  int i,oras1,oras2,lungime;
  fi>>nroras>>nrdrum>>kcheie;
  localitate[0]=1;localitate[kcheie+1]=nroras;
  for (i=1;i<=kcheie;i++) fi>>localitate[i];
  for (i=1;i<=nrdrum;i++)
  {
    fi>>oras1>>oras2>>lungime;
    drum[oras1].push_back(oras2);
    drum[oras2].push_back(oras1);
    lg[oras1].push_back(lungime);
    lg[oras2].push_back(lungime);
  }
}

void djikstra(int x)
{
  int i;
  coada el,el2;
  el.nod=x;el.dist=0;
  for (i=1;i<=nroras;i++) distanta[i]=lgmax;distanta[x]=0;
  for (i=1;i<=nroras;i++) viz[i]=0;
  pq.push(el);
  while (!pq.empty())
  {
    el=pq.top();
    pq.pop();
    if (!viz[el.nod])
      for (i=0;i<drum[el.nod].size();i++)
    {
      el2.nod=drum[el.nod][i];
      el2.dist=el.dist+lg[el.nod][i];
      if (el2.dist<distanta[el2.nod])
      {
        pq.push(el2);
        distanta[el2.nod]=el2.dist;
      }
    }
    viz[el.nod]=1;
  }
  for (i=1;i<=kcheie+1;i++) drummin[x][localitate[i]]=distanta[localitate[x]];
}

void bt(int n,int orasales)
{
  int i;
  if (orasales>kcheie)
  {
    sol=sol+drummin[orasales][nroras];
    mini=min(mini,sol);
    sol=sol-drummin[orasales][nroras];
  }
  for (i=1;i<=kcheie;i++)
    if (localitate[i]!=orasales)
    {
      sol=sol+drummin[orasales][localitate[i]];
      fr[localitate[i]]++;
      bt(n+1,localitate[i]);
      fr[localitate[i]]--;
      sol=sol-drummin[orasales][localitate[i]];
    }
}
int main()
{
  citire();
  for (int i=0;i<=kcheie;i++) djikstra(localitate[i]);
  mini=lgmax;
  bt(1,1);
  fo<<mini;
  return 0;
}