Cod sursa(job #671304)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 31 ianuarie 2012 09:52:21
Problema Ubuntzei Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <fstream>
#include <utility>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
vector<pair<int,int> >v[2005];
queue<int> Q;
queue< pair<int,int> >C;
bool inc[20][150000],inq[2005];
int d[2005],D[20][150000],n,m,k,c[20],a[20][20],put[20];
void puteri()
{
    int p=1;
    for(int i=1;i<=19;i++)
    {
        put[i-1]=p;
        p*=2;
    }
}
void bellman(int x)
{
    for(int i=1;i<=n;i++) d[i]=int(2e9);
    d[x]=0; Q.push(x); inq[x]=1;
    while(!Q.empty())
    {
        x=Q.front();
        inq[x]=0;
        Q.pop();
        for(int i=0;i<v[x].size();i++)
        if(d[v[x][i].first]>d[x]+v[x][i].second)
        {
            d[v[x][i].first]=d[x]+v[x][i].second;
            if(!inq[v[x][i].first])
            {
                inq[v[x][i].first]=1;
                Q.push(v[x][i].first);
            }
        }
    }
}
void bellman2(int x)
{
    pair<int,int> nod;
    for(int i=1;i<=k;i++)
    for(int j=1;j<=150000;j++)
        D[i][j]=int(2e9);
    C.push(make_pair(x,1)); inc[x][1]=1;
    D[x][1]=0;
    while(!C.empty())
    {
        nod=C.front();
        C.pop();
        inc[nod.first][nod.second]=0;
        for(int i=1;i<=k;i++)
        if((!(nod.second&put[i-1])) and
           (D[i][nod.second+put[i-1]]>a[nod.first][i]+D[nod.first][nod.second]))
        {
            D[i][nod.second+put[i-1]]=a[nod.first][i]+D[nod.first][nod.second];
            if(!inc[i][nod.second+put[i-1]])
            {
                C.push(make_pair(i,nod.second+put[i-1]));
                inc[i][nod.second+put[i-1]]=1;
            }
        }
    }

}
int main()
{
    int i,x,y,cost,j;
    ifstream fi("ubuntzei.in");
    ofstream fo("ubuntzei.out");
    puteri();
    fi>>n>>m>>k;
    for(i=1;i<=k;i++)
    fi>>c[i];
    c[++k]=1; c[++k]=n;
    swap(c[k-1],c[1]);
    for(i=1;i<=m;i++)
    {
        fi>>x>>y>>cost;
        v[x].push_back(make_pair(y,cost));
        v[y].push_back(make_pair(x,cost));
    }
    for(i=1;i<=k;i++)
    {
        bellman(c[i]);
        for(j=1;j<=k;j++) if(i!=j) a[i][j]=d[c[j]];
    }
    bellman2(1);
    fo<<D[k][put[k]-1]<<"\n";
    return 0;
}