Pagini recente » Cod sursa (job #2285730) | Cod sursa (job #1976031) | Cod sursa (job #1965638) | Cod sursa (job #2436444) | Cod sursa (job #1624247)
#include <iostream>
#include <fstream>
#include <vector>
#include <climits>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m,k;
vector < vector <int> > neighbours;
vector <int> friends;
int friends_checked[2005],road_length[2005][2005],road_passed[2005][2005];
int optimal_road_cost=INT_MAX,current_cost,friends_checked_count;
bool is_friend(int node)
{
for(int i=0;i<friends.size();i++)
{
if(friends[i]==node)
{
return true;
}
}
return false;
}
bool verify()
{
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=friends_checked[i];
}
if(sum==k)
return true;
return false;
}
void back_track(int p)
{
if(p==n)
{
if(verify())
{
if(current_cost<optimal_road_cost)
{
optimal_road_cost=current_cost;
}
}
}
else
{
for(int i=0;i<neighbours[p].size();i++)
{
if(current_cost+road_length[p][neighbours[p][i]]<optimal_road_cost&&road_passed[neighbours[p][i]][p]==0&&road_passed[p][neighbours[p][i]]==0)
{
current_cost+=road_length[p][neighbours[p][i]];
road_passed[p][neighbours[p][i]]++;
road_passed[neighbours[p][i]][p]++;
if(is_friend(neighbours[p][i]))
{
friends_checked[neighbours[p][i]]=1;
//friends_checked_count++;
back_track(neighbours[p][i]);
friends_checked[neighbours[p][i]]=0;
current_cost-=road_length[p][neighbours[p][i]];
// friends_checked_count--;
}
else
{
back_track(neighbours[p][i]);
current_cost-=road_length[p][neighbours[p][i]];
}
road_passed[p][neighbours[p][i]]--;
road_passed[neighbours[p][i]][p]--;
}
}
}
}
int main()
{
fin>>n>>m;
fin>>k;
friends.resize(1);
for(int i=1;i<=k;i++)
{
int aux_read;
fin>>aux_read;
friends.push_back(aux_read);
}
neighbours.resize(n+1);
for(int i=1;i<=m;i++)
{
int node1,node2,length;
fin>>node1>>node2>>length;
neighbours[node1].push_back(node2);
neighbours[node2].push_back(node1);
road_length[node1][node2]=length;
road_length[node2][node1]=length;
}
back_track(1);
fout<<optimal_road_cost;
return 0;
}