Pagini recente » Cod sursa (job #18336) | Cod sursa (job #110050) | Cod sursa (job #3253037) | Cod sursa (job #30384) | Cod sursa (job #2294793)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("team.in");
ofstream g ("team.out");
vector <pair<int,int> > v[1003];
int dist[1003][1003],n,jos[1003];
typedef struct usu
{
int nod,cost;
bool operator<(const usu& t) const
{
return cost>t.cost;
}
};
priority_queue <usu> q;
void solve(int bos)
{
for(int i=1;i<=n;++i)
{
dist[jos[bos]][i]=100000000;
q.push({i,100000000});
}
dist[jos[bos]][jos[bos]]=0;
q.push({jos[bos],0});
while(!q.empty())
{
int nod=q.top().nod;
int cost=q.top().cost;
q.pop();
if(cost>dist[jos[bos]][nod]) continue;
for(vector <pair <int,int> >::iterator it=v[nod].begin();it!=v[nod].end();++it)
{
if(cost+it->second<dist[jos[bos]][it->first])
{
dist[jos[bos]][it->first]=cost+it->second;
q.push({it->first,dist[jos[bos]][it->first]});
}
}
}
}
int p,m,x,y,c,dp[53][53][53];
int main()
{
f>>p>>n>>m;
for(int i=1;i<=m;++i)
{
f>>x>>y>>c;
v[x].push_back({y,c});
v[y].push_back({x,c});
}
for(int i=1;i<=p;++i) f>>jos[i];
jos[0]=1;
for(int i=0;i<=p;++i) solve(i);
for(int i=0;i<=p;++i)
{
for(int j=0;j<=p;++j)
{
for(int k=0;k<=p;++k)
{
dp[i][j][k]=100000000;
if(i>j) dp[i][j][k]=0;
}
}
}
for(int i=0;i<=p;++i) dp[i][i][i]=0;
for(int l=1;l<=p;++l)
{
for(int i=1;(i+l-1)<=p;++i)
{
int j=i+l-1;
for(int k=0;k<=p;++k)
{
if(i==j&&i==k) continue;
for(int t=i;t<=j;++t) dp[i][j][k]=min(dp[i][j][k],dp[i][t-1][t]+dp[t+1][j][t]+dist[jos[k]][jos[t]]);
}
}
}
g<<dp[1][p][0];
return 0;
}