Pagini recente » Cod sursa (job #245014) | Cod sursa (job #43906)
Cod sursa(job #43906)
#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;
}