Cod sursa(job #806250)

Utilizator stef1995mmarcu stefan ovidiu stef1995m Data 2 noiembrie 2012 14:27:09
Problema Ubuntzei Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int inf=2000000000,maxx1=17,maxx2=2002,maxx3=1<<15;
int n,m,k,i,j,mult,A,B,C,K[maxx1],a[maxx1][maxx3],dist[maxx1][maxx2],minim=inf,poz,poz2,dista,tata[maxx2],sol[maxx2];
vector < pair<int,int> > x[maxx2];
vector <int> curent;
bool viz[maxx2];
void read()
{
	scanf("%d %d\n%d",&n,&m,&k);
	for(i=1;i<=k;i++)
		scanf("%d ",&K[i]);
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d",&A,&B,&C);
		x[A].push_back(make_pair(B,C));
		x[B].push_back(make_pair(A,C));
	}
}
int exist(int bit,int nr)
{
	if(nr & (1<<bit))
		return 1;
	return 0;
}
int distanceee(int i,int j)
{
    for(int k=0;k<x[i].size();k++)
        if(x[i][k].first==j)
            return x[i][k].second;
}
void dijkstra(int start,int sol[maxx2])
{
    int i;
    for(i=0;i<x[start].size();i++)
        sol[x[start][i].first]=x[start][i].second;
    for(i=1;i<=n;i++)
    {
        if(i!=start)
        {
            viz[i]=false;
            if(sol[i]==0)
                sol[i]=inf;
            curent.push_back(i);
        }
    }
    for(int k=1;k<n;k++)
    {
        minim=inf;
        for(i=0;i<curent.size();i++)
            if(minim>sol[curent[i]]&&viz[curent[i]]==false)
            {
                minim=sol[curent[i]];
                poz=curent[i];
                poz2=i;
            }
        viz[poz]=true;
        for(i=0;i<curent.size();i++)
        {
            dista=distanceee(poz,curent[i]);
            if(viz[curent[i]]==false&&dista!=0)
            {
                if(sol[curent[i]]>sol[poz]+dista)
                {
                    sol[curent[i]]=sol[poz]+dista;
                    tata[curent[i]]=poz;
                }
            }
        }
        curent.erase (curent.begin()+poz2);
    }
}
int main()
{
	freopen("ubuntzei.in","r",stdin);
	freopen("ubuntzei.out","w",stdout);
	read();
	if(k==0)
	{
		dijkstra(1,sol);
		printf("%d\n",sol[n]);
	}
	else
	{
		for(i=1;i<=k;i++)
			dijkstra(K[i],dist[i]);
		for(mult=1;mult<(1<<k);mult++)
		{
			for(i=0;i<=k-1;i++)
				if(mult==(1<<i))
				{
					a[i+1][mult]=dist[i+1][1];
					i=k+4;
				}
			if(i==k)
			{
				for(i=1;i<=k;i++)
				{
					a[i][mult]=inf;
					if(exist(i-1,mult))
						for(j=1;j<=k;j++)
							if(i!=j&&exist(j-1,mult))
								a[i][mult]=min(a[i][mult],a[j][mult-(1<<(i-1))]+dist[j][K[i]]);
				}
			}
		}
        int col=(1<<k)-1;
        minim=inf;
        for(i=1;i<=k;i++)
            minim=min(minim,a[i][col]+dist[i][n]);
        printf("%d\n",minim);
	}
	return 0;
}