Cod sursa(job #43906)

Utilizator pocaituDavid si Goliat pocaitu Data 30 martie 2007 17:22:13
Problema Team Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<stdio.h>
#include<fstream.h>
#define nmax 505
#define pmax 55
#define infi 32000
long c[nmax][nmax],poz[pmax],d[pmax][nmax],n,p;
long solutie;
long minim(long a,long b) {return a<b?a:b;}


void readdata()
{long i,j,a,b,C,m;

 freopen("team.in","r",stdin);
 scanf("%ld%ld%ld",&p,&n,&m);
 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
   c[i][j]=infi;
 for(i=1;i<=m;i++)
  {scanf("%ld%ld%ld",&a,&b,&C);
   //d[a][++d[a][0]]=b;
   //d[b][++d[b][0]]=a;
   c[a][b]=c[b][a]=C;
   }

 for(i=1;i<=p;i++)
  scanf("%ld",&poz[i]);
 }


void dijkstra(long s)
{long viz[nmax],i,j,min,nod;
 viz[s]=1;
 i=1;
 memset(viz,0,sizeof(viz));
 for(i=1;i<=n;i++)
  d[s][i]=c[s][i];
 d[s][s]=0;
 i=1;
 while(i<=n)
   {for(j=1,min=infi;j<=n;j++)
	   if(!viz[j]&&d[s][j]<min)
		 {min=d[s][j];
		  nod=j;
		  }
	viz[nod]=1;

	for(j=1;j<=n;j++)
	 if(d[s][nod]+c[nod][j]<d[s][j])
	   d[s][j]=d[s][nod]+c[nod][j];
	i++;
	}
}





void solve()
{long i,l,j,k,ii;
long sol[pmax][pmax][pmax];

 for(i=1;i<=p;i++)
  dijkstra(poz[i]);

 //initializare
 for(i=1;i<=p;i++)
  for(j=1;j<=p;j++)
	sol[1][i][j]=d[poz[j]][poz[i]];
 memset(sol[0],0,sizeof(sol[0]));
 for(l=2;l<=p;l++)
   for(k=1;k<=p;k++)
	 for(i=1;i<=p-l+1;i++)
	   if(i+l-1>k&&i<=k)
		 sol[l][k][i]=sol[k-i][k][i]+sol[i+l-k-1][k][k+1];
	   else
		 for(ii=i,sol[l][k][i]=infi;ii<=i+l-1;ii++)
			sol[l][k][i]=minim(sol[l][k][i],d[poz[k]][poz[ii]]+sol[ii-i][ii][i]+sol[i+l-1-ii][ii][ii+1]);

//for(i=1,solutie=infi;i<=n;i++)
 for(k=1,solutie=infi;k<=p;k++)
   solutie=minim(solutie,sol[p][k][1]+d[poz[k]][1]);

}


void printdata()
{freopen("team.out","w",stdout);
 printf("%ld",solutie);
 fclose(stdout);
 }


int main()
{

  readdata();
  solve();
  printdata();

 return 0;
}