Cod sursa(job #2022911)

Utilizator refugiatBoni Daniel Stefan refugiat Data 17 septembrie 2017 17:57:54
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <set>
#define c second
#define d first
#define INF 999999999
using namespace std;
ifstream si("ubuntzei.in");
ofstream so("ubuntzei.out");
vector<pair<int,int> > g[2005];
bitset<2005> l;
set<pair<int,int> > q;
int x[16];
int surs[2005];
int d[20][2005];
int pd[33000][25];

int n;
void dij(int s, int sol[])
{
	int vc;
	for(int i=1;i<=n;++i)
		sol[i]=INF;
	sol[s]=0;
	q.clear();
	for(int i=1;i<=n;++i)
		q.insert(make_pair(sol[i],i));
	for(int i=1;i<n;++i)
	{
		pair<int,int> top=*q.begin();
		q.erase(q.begin());
		int nod=top.c;
		if(sol[nod]<top.d) continue;
		for(int j=0;j<g[nod].size();++j)
			if(sol[vc=g[nod][j].d]>sol[nod]+g[nod][j].c)
			{
				sol[vc]=sol[nod]+g[nod][j].c;
				q.insert(make_pair(sol[vc],vc));
			}
	}
}
int main()
{
    int m;
    si>>n>>m;
    int k;
    si>>k;
    for(int i=0;i<k;++i)
    {
        si>>x[i];
    }
    int a,b,c;
    for(int i=1;i<=m;++i)
    {
        si>>a>>b>>c;
        g[a].push_back(make_pair(b,c));
        g[b].push_back(make_pair(a,c));
    }

    dij(1,surs);
	if(k==0)
	{
		cout<<surs[n];
		return 0;
	}

	for(int i=0;i<k;++i)
		dij(x[i],d[i]);
	for(int i=1;i<(1<<k);++i)
	{
	    int j;
		for(j=0;j<k;++j)
			if(i==(1<<j))
				break;
		if(j<k&&i==(1<<j))
		{
			pd[i][j]=surs[x[j]];
			continue;
		}
		for(j=0;j<k;++j)
		{
			pd[i][j]=INF;
			if(i&(1<<j))
				for(int l=0;l<k;++l)
					if(l!=j&&(i&(1<<l)))
					{
						pd[i][j]=min(pd[i][j],pd[i-(1<<j)][k]+d[k][x[j]]);
					}
		}
	}
	int bst=INF;
	for(int i=0;i<k;++i)
		bst=min(bst,pd[(1<<k)-1][i]+d[i][n]);
    so<<bst<<'\n';
    return 0;
}