Pagini recente » Cod sursa (job #2153832) | Cod sursa (job #731980)
Cod sursa(job #731980)
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
using namespace std;
int i,j,n,m,k;
int C[512][512];
int _min[64][64][64];
int P[64][64];
int D[64];
int v,e;
void readdata(){
memset(C,1,sizeof(C));
FILE *f=fopen ("team.in","r");
fscanf (f,"%d",&n);
fscanf (f,"%d%d",&v,&e);
for (i=1;i<=e;i++)
{
int a,b,c;
fscanf (f,"%d%d%d",&a,&b,&c);
C[a][b]=C[b][a]=c;
}
D[0]=1;
for (i=1;i<=n;i++)
fscanf (f,"%d",&D[i]);
}
int X[512];
int s[512];
void djikstra(int x){
memset(X,127,sizeof(X));
X[x]=0;
memset(s,0,sizeof(s));
int i,j;
for (i=1;i<=v;i++){
int _min=0;
for (j=1;j<=v;j++)
if (!s[j]&&X[j]<X[_min]) _min=j;
for (j=1;j<=v;j++)
if (X[_min]+C[_min][j]<X[j])
X[j]=X[_min]+C[_min][j];
s[_min]=1;
}
}
void reduce_graph(){
for (i=0;i<=n;i++)
{
djikstra(D[i]);
for (j=0;j<=n;j++)
P[i][j]=X[D[j]];
}
}
#define MIN(a,b) ((a)<(b)?(a):(b))
int get(int j,int x,int y){
if (x>y) return 0;
if (_min[j][x][y]>=0) return _min[j][x][y];
if (x==y&&j==x) return 0;
_min[j][x][y]=1000000000;
for (int k=x;k<=y;k++)
_min[j][x][y]=MIN(_min[j][x][y],P[j][k]+get(k,x,k-1)+get(k,k+1,y));
return _min[j][x][y];
}
int main(){
readdata();
reduce_graph();
memset(_min,255,sizeof(_min));
fprintf (fopen ("team.out","w"),"%d\n",get(0,1,n));
return 0;
}