Cod sursa(job #1939554)

Utilizator Bodo171Bogdan Pop Bodo171 Data 25 martie 2017 20:05:38
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
const int nmax=505;
const int pmax=55;
struct pq_member
{
    int node,co;
}el;
struct comp
{
    bool operator()(pq_member unu,pq_member doi)
    {
        return unu.co>doi.co;
    }
};
priority_queue<pq_member,vector<pq_member>,comp> pq;
vector< pair<int,int> > v[nmax];
int best[pmax][pmax][pmax],cost[pmax][pmax];
int dist[nmax],casa[pmax];
bool expanded[nmax];
int n,m,i,j,k,ind,start,costul,p,a,b,c,cnt;
void dijkstra(int nodstart)
{
    for(i=1;i<=n;i++)
        dist[i]=(1<<30),expanded[i]=0;
    dist[nodstart]=0;
    el.node=nodstart;el.co=0;
    pq.push(el);
    while(!pq.empty())
    {
        start=pq.top().node;
        costul=pq.top().co;
        pq.pop();
      if(!expanded[start])
        for(i=0;i<v[start].size();i++)
        {
            el.node=v[start][i].first;
            el.co=costul+v[start][i].second;
            if(el.co<dist[el.node])
            {
                dist[el.node]=el.co;
                pq.push(el);
            }
        }
           expanded[start]=1;
    }
}
int main()
{
    ifstream f("team.in");
    ofstream g("team.out");
    f>>p>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>a>>b>>c;
        v[a].push_back(make_pair(b,c));
        v[b].push_back(make_pair(a,c));
    }
    for(i=1;i<=p;i++)
    {
        f>>casa[i];
    }
    for(cnt=1;cnt<=p;cnt++)
    {
        dijkstra(casa[cnt]);
        for(i=1;i<=p;i++)
            cost[cnt][i]=dist[casa[i]];
        cost[cnt][p+1]=dist[1];
        cost[p+1][cnt]=dist[1];
    }
    for(i=1;i<=p;i++)
        for(j=1;j<=p;j++)
          for(k=1;k<=p+1;k++)
           best[i][j][k]=(1<<30)-1;
    for(i=1;i<=p;i++)
        best[1][i][i]=0;
    for(i=1;i<=p;i++)
        for(j=1;j<=p-i+1;j++)
          for(k=1;k<=p+1;k++)
    {
        if(k>=j&&k<=i+j-1)
            {
            if(best[k-j][j][k]+best[i-(k-j)-1][k+1][k]<best[i][j][k])
              best[i][j][k]=best[k-j][j][k]+best[i-(k-j)-1][k+1][k];
            }
     if(best[i][j][k]<(1<<30)-1)
        for(ind=1;ind<=p+1;ind++)
            if(best[i][j][k]+cost[k][ind]<best[i][j][ind])
                 best[i][j][ind]=best[i][j][k]+cost[k][ind];
    }
    g<<best[p][1][p+1];
    return 0;
}