Cod sursa(job #860591)

Utilizator fulgerulnegruFMI Ekart Dragos-Ioan fulgerulnegru Data 20 ianuarie 2013 13:45:42
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream in ("ubuntzei.in");
ofstream out ("ubuntzei.out");
vector<vector<int> > *a;
vector<int> *v1;
vector<int>s;
int min_g =10000000,n;

bool continu(int j){
  int i;
  for(i=0;i<j;i++)
    if(s[i] == s[j])
      return false;
  return true;
}

void min (){
  int suma_l=0,i;
  suma_l += (*a)[0][s[0]];
  for(i=0;i<s.size();i++)
    suma_l += (*a)[s[i]][s[i+1]];

  suma_l += (*a)[s[s.size()-1]][n-1];
  if(min_g>suma_l)
    min_g = suma_l;
}

void back(int l){
  int i;
  for(i=0;i<s.size();i++)
  {
    s[l] = (*v1)[i];
    if(continu(l)){
      if(l<s.size()-1)
        back(l+1);
      else
        min();
    }
  }
}


int main (){
  int m,k,i,j,t;
  in>>n>>m>>k;
  s.resize(k);
  vector<vector<int> > d(n,vector<int>(n,100000));
  a = &d;
  vector<int>v(k);
  v1 = &v;

  for(i=0;i<k;i++)
    in>>v[i];

  for(i=0;i<m;i++)
  {
    in>>j>>t;
    j--;t--;
    in>>d[j][t];
    d[t][j] = d[j][t];
  }

  for(t=0;t<n;t++)
    for(i=0;i<n;i++)
      for(j=0;j<n;j++)
        if(d[i][j] > d[i][t] + d[t][j])
        {
          d[i][j] = d[i][t] + d[t][j];
        }

  //cout<<"\n";
  //for(i=0;i<n;i++)
  //{
    //for(j=0;j<n;j++)
      //cout<<d[i][j]<<" ";
    //cout<<"\n";
  //}
  //
  //
  //

  if(k==0)
    out<<d[0][n-1];
  else{
    back(0);
    out<<min_g;
  }

  return 0;
}