Cod sursa(job #2004237)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 25 iulie 2017 12:55:54
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <climits>
using namespace std;
ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");
struct usu
{
    int nod,cost;
}E;
vector <usu> v[2005];
queue <int> q;
int i,j,n,m,x,y,k,c,K,minn,o,nr,dist[23][23],d[23][1<<15],loc[23],D[2005];
void BFS(int nr)
{
    int x,i;
    for(i=1;i<=n;++i) D[i]=INT_MAX;;
    D[loc[nr]]=0;
    q.push(loc[nr]);
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        for(i=0;i<v[x].size();++i)
        if(D[v[x][i].nod]>D[x]+v[x][i].cost)
        {
            D[v[x][i].nod]=D[x]+v[x][i].cost;
            q.push(v[x][i].nod);
        }
    }
    for(i=0;i<=k+1;++i)dist[nr][i]=D[loc[i]];
}
int main()
{
    f>>n>>m>>k;
    loc[0]=1;
    for(i=1;i<=k;++i) f>>loc[i];
    loc[k+1]=n;
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>c;
        E.nod=y;
        E.cost=c;
        v[x].push_back(E);
        E.nod=x;
        E.cost=c;
        v[y].push_back(E);
    }
    for(i=0;i<=k+1;++i) BFS(i);
    if(k==0) g<<dist[0][k+1];
    else
    {
        K=1<<(k);
        minn=INT_MAX;;
        for(i=0;i<=k+1;++i)
        for(j=0;j<K;++j) d[i][j]=INT_MAX;;
        d[0][0]=0;
        for(i=0;i<K;++i)
        {
            for(j=0;j<=k;++j)
            {
                if(d[j][i]!=INT_MAX)
                for(o=1;o<=k;++o) if((i&(1<<(o-1)))==0) d[o][(1<<(o-1))|i]=min(d[o][(1<<(o-1))|i],d[j][i]+dist[j][o]);
            }
        }
        for(i=1;i<=k;++i) minn=min(minn,d[i][K-1]+dist[i][k+1]);
        g<<minn;
    }
    return 0;
}