Cod sursa(job #1624247)

Utilizator Tuddy18Tolciu Tudor Tuddy18 Data 2 martie 2016 09:40:01
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.83 kb
#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;
}