Pagini recente » Cod sursa (job #126016) | Cod sursa (job #1934935) | Cod sursa (job #2756301) | Cod sursa (job #187298) | Cod sursa (job #551945)
Cod sursa(job #551945)
#include<stdio.h>
#include<string.h>
#include<set>
#include<vector>
using namespace std;
#define pb push_back
#define minim(a,b) (a<b ? a : b)
#define INF 1000000000
set<int> myset;
set<int> ::iterator it;
vector<int> v[505],cost[505];
int p,n,m,nr;
int d[53][53][53];
int dist[505][505];
int go[53],final[53];
int surse[53],uz[505];
void dijkstra(int nod)
{
int i,j,lim;
memset(uz,0,sizeof(uz));
for(i=0;i<=n;i++)
dist[nod][i]=INF;
dist[nod][nod]=0;
for(i=1;i<n;i++)
{
int s=0;
for(j=1;j<=n;j++)
if (!uz[j] && dist[nod][s]>dist[nod][j])
s=j;
uz[s]=1;
lim=v[s].size();
for(j=0;j<lim;j++)
dist[nod][v[s][j]]=minim(dist[nod][v[s][j]],
cost[s][j]+dist[nod][s]);
}
}
int main ()
{
int i,j,k,l,t,a,b,c,cst;
freopen("team.in","r",stdin);
freopen("team.out","w",stdout);
scanf("%d%d%d",&p,&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
v[a].pb(b);
cost[a].pb(c);
v[b].pb(a);
cost[b].pb(c);
}
for(i=1;i<=p;i++)
{
scanf("%d",&final[i]);
myset.insert(final[i]);
}
myset.insert(1);
for(it=myset.begin();it!=myset.end();it++)
surse[++nr]=*it;
for(i=1;i<=nr;i++)
dijkstra(surse[i]);
for(i=1;i<=p;i++)
for(j=1;j<=nr;j++)
if(final[i]==surse[j])
{
go[i]=j;
break;
}
for(l=1;l<=p;l++)
for(j=1;j<=p-l+1;j++)
{
k=j+l-1;
for (i=1;i<=nr;i++)
{
d[i][j][k]=INF;
for(t=j;t<=k;t++)
{
cst=dist[final[t]][surse[i]];
if(t>j)
cst+=d[go[t]][j][t-1];
if(t<k)
cst+=d[go[t]][t+1][k];
d[i][j][k]=minim(d[i][j][k],cst);
}
}
}
printf("%d\n",d[1][1][p]);
return 0;
}