Cod sursa(job #2011518)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 16 august 2017 15:38:47
Problema Ubuntzei Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>
#define Nmax 2005
#define INF (int)2e9+5
#define Kmax 16
#define tip pair<int,int>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
list <tip> G[Nmax];
int n,m,k;
int a[1<<Kmax][Kmax];
int s[Kmax];
int vct[Nmax];
int T[Kmax][Nmax];
set <tip> heap;
void Dijkstra(int source, int *sol)
{
    fill(sol+1,sol+n+1,INF);
    sol[source]=0;
    heap.clear();
    int i;
    tip x;
    list <tip> :: iterator it;
    for(i=1;i<=n;i++)
        heap.insert({sol[i],i});
    for(i=1;i<n;i++)
    {
        x=*heap.begin();
        heap.erase(heap.begin());
        if(sol[x.second]>=x.first)
        {
            for(it=G[x.second].begin();it!=G[x.second].end();it++)
                if(sol[it->first]>sol[x.second]+it->second)
                {
                    sol[it->first]=sol[x.second]+it->second;
                    heap.insert({sol[it->first],it->first});
                }
        }
    }
}
inline bool bit(const int &x,const int &nr)
{
    return (x&(1<<nr))!=0;
}
int main()
{
    f>>n>>m>>k;
    int i,j,cost,con;
    for(i=0;i<k;i++)
        f>>s[i];
    while(m)
    {
        --m;
        f>>i>>j>>cost;
        G[i].push_back({j,cost});
        G[j].push_back({i,cost});
    }
    Dijkstra(1,vct);
    if(!k)
    {
        g<<vct[n];
        return 0;
    }
    for(i=0;i<k;i++)
        Dijkstra(s[i],T[i]);
    for(i=1;i<(1<<k);i++)
	{
		for(j=0;j<k;j++)
			if(i==(1<<j))
				break;
		if(j<k and i==(1<<j))
		{
			a[i][j]=vct[s[j]];
			continue;
		}
		for(j=0;j<k;j++)
		{
			a[i][j]=INF;
			if(bit(i,j))
				for(con=0;con<k;con++)
					if(con!=j and bit(i,con))
						a[i][j]=min(a[i][j],a[i-(1<<j)][con]+T[con][s[j]]);
		}
	}
	int minn=INF;
    for(i=0;i<k;i++)
        minn=min(minn,a[(1<<k)-1][i]+T[i][n]);
    g<<minn;


    return 0;
}