Cod sursa(job #2457801)

Utilizator ViAlexVisan Alexandru ViAlex Data 18 septembrie 2019 19:12:45
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <iostream>
#include<set>
#include<fstream>
#include<vector>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n,m,k;
int locatii[20];
int adiacenta[2000][2000];
int adiacenta2[2000][2000];//cel mai scurt drum


void read()
{
    in>>n>>k>>m;
    for(int i=0; i<m; i++)
        in>>locatii[i];

    int from,to,len;
    for(int i=0; i<k; i++)
    {
        in>>from>>to>>len;
        adiacenta[from-1][to-1]=len;
        adiacenta[to-1][from-1]=len;
    }
}


void dijkstra(int start)
{
    set<pair<int,int>> nodes;
    nodes.insert(std::pair<int,int>(0,start));//start node with 0 length

    while(nodes.size())
    {
        int index=nodes.begin()->second;
        int cost=nodes.begin()->first;
        nodes.erase(nodes.begin());
        for(int i=0; i<2000; i++)
        {
            if(adiacenta[index][i])
            {
                int cost_nou=cost+adiacenta[index][i];
                if(adiacenta2[start][i]==0 ||cost_nou<adiacenta2[start][i])
                {
                    adiacenta2[start][i]=cost_nou;
                    nodes.insert(std::pair<int,int>(cost_nou,i));
                }
            }
        }
    }


}

int recurs(int index,vector<int>ramas,int total)
{
    if(ramas.size()==1)
    {
        return total+adiacenta2[index][n-1];
    }
    int maxx=0;
    for(int i=0; i<ramas.size(); i++)
    {
        vector<int>cpy=ramas;
        cpy.erase(cpy.begin()+i);
        int ii=ramas[i];
        if(ii!=index)
        {

            maxx=max(maxx,recurs(ii,cpy,total+adiacenta2[index][ii]));
        }
    }
    return maxx;
}

void solve_locations()
{
    vector<int>elem;
    elem.push_back(0);
    dijkstra(0);
    for(int i=0; i<m; i++)
    {
        dijkstra(locatii[i]-1);
        elem.push_back(locatii[i]-1);
    }
    out<<recurs(0,elem,0);
}


int main()
{
    read();
    solve_locations();

    return 0;
}