Cod sursa(job #803245)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 27 octombrie 2012 11:43:14
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#define mp make_pair
#define pb push_back
#define f first
#define s second
using namespace std;

int vk[20];
int dist[20][20];
int dist2[2005],dp[(1<<15)+13][20]; // stare | ultimul oras vizitat din stare
int isk[2005];
int n,m,k,x,y,cost;
vector<pair<int,int> > list[2005];
queue<int> q;

void bfs(int nodd)
{
    q.push(nodd);
    while(q.size())
    {
        int nod=q.front();
        q.pop();

        for(int i=0;i<list[nod].size();i++)
        {
            int next_nod=list[nod][i].f;
            int cost=list[nod][i].s;
            if(dist2[next_nod]>dist2[nod]+cost)
            {
                dist2[next_nod]=dist2[nod]+cost;
                if(isk[next_nod])
                    dist[isk[nodd]][isk[next_nod]]=dist2[next_nod];

                q.push(next_nod);
            }
        }
    }
}
void din()
{
    for(int i=1;i<=k-2;i++)
        dp[(1<<(i-1))][i]=dist[k-1][i];
    for(int i=1;i<(1<<(k-2));i++)
    {

        for(int j=1;j<=k-2;j++)
        {
            if( ((1<<(j-1))&i)==0 )
            {
                dp[(i|(1<<(j-1)))][j]=1<<30;

                for(int p=1;p<=k-2;p++)
                {
                    if((1<<(p-1)&i))
                    {
                        dp[(i|(1<<(j-1)))][p]=min( dp[(i|(1<<(j-1)))][p],dp[i][j]+dist[j][p]);
                    }
                }
            }
        }
    }
}
int main()
{
    ifstream f("ubuntzei.in");
    ofstream g("ubuntzei.out");
    f>>n>>m>>k;
    for(int i=1;i<=k;i++)
      {
          f>>vk[i];
          isk[vk[i]]=i;
      }
    k+=2;
    vk[k-1]=1;
    vk[k]=n;
    isk[vk[k-1]]=k-1;
    isk[vk[k]]=k;

    for(int i=1;i<=m;i++)
    {
        f>>x>>y>>cost;
        list[x].pb(mp(y,cost));
        list[y].pb(mp(x,cost));
    }
    for(int i=1;i<=k;i++)
     {
         memset(dist2,127,sizeof(dist2));
         dist2[vk[i]]=0;
         bfs(vk[i]);
     }
     din();
     int minim=1<<30;
    for(int i=1;i<=k-2;i++)
        minim=min(minim,dp[(1<<(k-2))-1][i]+dist[i][k]);
    g<<minim;
    return 0;
}