Cod sursa(job #2321178)

Utilizator alexkosaAlex Kosa alexkosa Data 15 ianuarie 2019 19:32:46
Problema Ubuntzei Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>
#include <vector>
#include <set>
#include <climits>

using namespace std;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

int n,m,a[2003][2003],k,v[17],sol=INT_MAX,viz1[20];

multiset<pair<int,int> >heap;

vector<pair<int,int> >g[2003];

void dijkstra(int start)
{
    heap.insert(make_pair(0,start));
    a[start][start]=0;
    while(!heap.empty())
    {
        int nod=heap.begin()->second;
        heap.erase(heap.begin());
        for(vector<pair<int,int> > :: iterator it=g[nod].begin();it!=g[nod].end();it++)
        {
            int to=it->first;
            int cost=it->second;
            if(a[start][to]>a[start][nod]+cost)
            {
                if(a[start][to]!=INT_MAX)
                    heap.erase(heap.find(make_pair(a[start][to],to)));
                a[start][to]=a[start][nod]+cost;
                heap.insert(make_pair(a[start][to],to));
            }
        }
    }
}
bool check(int viz[])
{
    for(int i=1;i<=k;i++)
        if(viz[v[i]]==0)
            return false;
    return true;
}
void caca(int nod,int viz[],int dist)
{
    if(check(viz))
    {
        dist+=a[nod][n];
        if(dist<sol)
            sol=dist;
    }
    else{
    for(int i=1;i<=k;i++)
        if(v[i]!=nod)
    {
        if(viz[v[i]]==0)
        {   viz[v[i]]=1;
            caca(v[i],viz,dist+a[nod][v[i]]);
            viz[v[i]]=0;
        }
    }
    }

}

int main()
{
    fin>>n>>m>>k;
    for(int i=1;i<=k;i++)
    {
        fin>>v[i];
    }
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        fin>>a>>b>>c;
        g[a].push_back(make_pair(b,c));
        g[b].push_back(make_pair(a,c));
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            a[i][j]=INT_MAX;
    dijkstra(1);
    for(int i=1;i<=k;i++)
        dijkstra(v[i]);
    for(int i=1;i<=k;i++)
    {
        viz1[v[i]]=1;
        caca(v[i],viz1,a[1][v[i]]);
        viz1[v[i]]=0;
    }
    fout<<sol;
}