Pagini recente » Cod sursa (job #1033499) | Cod sursa (job #1204211)
#include <fstream>
#include <queue>
using namespace std;
ifstream F("team.in");
ofstream G("team.out");
const int N = 510;
const int M = 55;
int n,m,mm;
int d[M][M][M],dst[N];
vector< pair<int,int> > v[N];
int cst[M][N];
int in[N];
void bellman(int x,int n)
{
queue<int> q;
q.push( n );
in[n] = 1;
while ( !q.empty() )
{
int n = q.front();
q.pop();
in[n] = 0;
for (size_t i=0;i<v[n].size();++i)
{
int nn = v[n][i].first;
int cc = v[n][i].second;
if ( cst[x][nn] > cst[x][n] + cc )
{
cst[x][nn] = cst[x][n] + cc;
if ( in[nn] == 0 )
{
q.push( nn );
in[nn] = 1;
}
}
}
}
}
int main()
{
F>>m>>n>>mm;
for (int i=1,x,y,c;i<=mm;++i)
{
F>>x>>y>>c;
v[x].push_back(make_pair(y,c));
v[y].push_back(make_pair(x,c));
}
for (int i=1;i<=m;++i)
F>>dst[i];
dst[0] = 1;
for (int i=0;i<=m;++i)
{
for (int j=1;j<=n;++j)
cst[i][j] = 1<<29;
cst[i][dst[i]] = 0;
bellman(i,dst[i]);
}
for (int j=1;j<=m;++j)
for (int i=j;i>=1;--i)
for (int ds=0;ds<=m;++ds)
{
d[i][j][ds] = 1<<29;
for (int l=i;l<=j;++l)
{
int act = 0;
if ( i <= l-1 ) act += d[i][l-1][l];
if ( l+1 <= j ) act += d[l+1][j][l];
act += cst[ds][dst[l]];
d[i][j][ds] = min(d[i][j][ds],act);
}
}
G<<d[1][m][0]<<'\n';
}