Cod sursa(job #703364)

Utilizator yero007Daniel Iulian yero007 Data 2 martie 2012 12:02:08
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
/*
ubuntzei-judet
*/
#include<cstdio>
#include <cstring>
#define INF 4000000000
using namespace std;
unsigned int a[1001][5001],C[1001][5001], r[5001];

unsigned int ubunt[5001],st[5001];
unsigned int n,m,i,j,k,u,p,x,y,z;
//unsigned int INF=10000000;
unsigned int s_min=INF;
void citire()
{
	freopen("ubuntzei.in","r",stdin);
	scanf("%d %d", &n,&m);
	scanf("%d", &u);
	//memset(C,INF,1001*5001*sizeof(int));
	for(i=1;i<=1001;i++)
		for(j=1;j<=5001;j++)
			C[i][j]=INF;
	ubunt[1]=1;
	ubunt[u+2]=n;
	for(i=2;i<=u+1;i++)
		scanf("%d",&ubunt[i]);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		a[x][y]=a[y][x]=1;
		C[x][y]=C[y][x]=z;
	}
}
void suma()
{	
	unsigned int s=0,sw=1;
	memset(r,0,5001*sizeof(int));
	for(i=1;i<=n;i++)
		r[st[i]]=1;
	for (i=1;i<=n&&sw==1;i++)
	{
		int nr=ubunt[i];
		if( r[nr]==0)
			sw=0;
	}
	if(sw==1)
	{
		for(i=1;i<=u+1;i++)
	{
		//s+=C[ ubunt[st[i]] ][ubunt[st[i+1]]];
		s+=C[ st[i] ][ st[i+1]];
		
	}
	if(s<s_min)
		s_min=s;
	}
}
void roy_floyd ()
{
   
   for (p=1;p<=n;p++)
      for (i=1;i<=n;i++)
         for (j=1;j<=n;j++)
            if (C[i][p]!=INF && C[p][j]!=INF)
               if (C[i][j]>C[i][p]+C[p][j])
               {
				C[i][j] = C[i][p]+C[p][j];
               }
}
void init()
{
	st[k]=1;
}
int succ()
{
	if(st[k]<n)
	{
		st[k]=st[k]+1;
		return 1;
	}
	return 0;
}
int ev()
{ 
	return 1;
}
int sol()
{
	if (k==u+1)
		if (a[st[k]][st[k-1]]==1 || a[st[k-1]][st[k]])
		{
			suma();
			return 1;
		}
	return 0;
}
void back()
{
int as;
k=2;
init();
while(k>=2)
{do{} 	while(as==succ()&& !ev());
 if(as)
	if(sol())
		suma();
		else
			{k++;
			 init();
			}
 else
	k--;
}
}
int main()
{
	citire();
	roy_floyd();
	if(k!=0)
	{
		st[1]=1;
	st[u+2]=n;
	back();}
	else
		s_min=C[1][n];
	freopen("ubuntzei.out","w",stdout);
	printf("%d",s_min);
	
}