Pagini recente » Cod sursa (job #3261178) | Cod sursa (job #6797) | Cod sursa (job #3180666) | Cod sursa (job #117873) | Cod sursa (job #2958317)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("team.in");
ofstream g("team.out");
int p,n,m,d[501][501],dist[501],poz[51];
struct muchie
{
int x,cost;
};
vector<muchie>a[501];
void dijkstra(int dist[],int s)
{
priority_queue<pair<int,int>, vector<pair<int,int>> ,greater<>>q;
q.push({0,s});
for(int i=1;i<=n;i++)
dist[i]=1e9;
dist[s]=0;
while(!q.empty())
{
auto x= q.top();
q.pop();
if(dist[x.second]!=x.first)
continue;
for(auto it :a[x.second])
{
if(dist[it.x]>x.first+it.cost)
{
dist[it.x]=x.first+it.cost;
q.push({dist[it.x],it.x});
}
}
}
}
int w[51][51][51];
int main()
{
f>>p>>n>>m;
for(int i=1;i<=m;i++)
{
int X,Y,Z;
f>>X>>Y>>Z;
a[X].push_back({Y,Z});
a[Y].push_back({X,Z});
}
for(int i=1;i<=p;i++)
f>>poz[i];
poz[0]=1;
for(int i=0;i<=p;i++)
{
dijkstra(dist,poz[i]);
// for(int j=1;j<=n;j++)
// g<<dist[j]<<" ";
for(int j=0;j<=p;j++)
d[i][j]=d[j][i]=dist[poz[j]];
// g<<'\n';
}
// g<<'\n';
/* for(int i=0;i<=p;i++)
{
for(int j=0;j<=p;j++)
g<<d[i][j]<<" ";
g<<'\n';
}*/
for(int k=1;k<=p;k++)
for(int i=0;i<=p;i++)
for(int j=0;j<=p;j++)
w[k][i][j]=1e9;
for(int ds=1;ds<=p;ds++)
{
for(int i=0;i<=p-ds;i++)
{
// for(int j=i;j<=i+ds;j++)
for(int j=1;j<=ds;j++)
for(int st=i;st<i+j;st++)
for(int dr=i+j;dr<=i+ds;dr++)
w[ds][i][i+ds]=min(w[ds][i][i+ds],d[st][dr]+w[j-1][i][i+j]+w[ds-j][i+j][i+ds]);
}
}
g<<w[p][0][p];
return 0;
}