Cod sursa(job #2065592)

Utilizator AndreidgDragomir Andrei Valentin Andreidg Data 13 noiembrie 2017 21:56:57
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
const int N = 2005;
const int K = 24;
const int INF = 999999999;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
struct poz{
    int p,d;
};
int n,m,k;
int v[N];
int dist[N];
bool ales[N];
queue  <int>    q;
vector <poz> V[N];

int mat[K][(1<<17)+10];
int dst[K][K];
void parc(int p)
{

    for(int i = 1; i <= n; i++)
    {
        dist[i] = INF;
    }

    q.push(p);
    dist[p] = 0;

    while(!q.empty())
    {
        int num = q.front();
        q.pop();
        ales[num] = 0;
        for(int i = 0; i< V[num].size(); i++)
        {
            int ds = dist[num] + V[num][i].d;
            int nx = V[num][i].p;
            if(dist[nx] > ds)
            {
                dist[nx] = ds;
                if(ales[nx]==0)
                {
                    ales[nx] = 1;
                    q.push(nx);
                }
            }
        }
    }
}
int main()
{
    f>>n>>m;
    f>>k;
    for(int i = 1; i<= k; i++)
    {
        f>>v[i];
    }
    v[0] = 1;
    v[k+1] = n;
    k++;
    for(int i = 1; i<= m; i++)
    {
        int x,y,ds;
        f>>x>>y>>ds;
        V[x].push_back({y,ds});
        V[y].push_back({x,ds});
    }

    for(int i = 0; i<= k; i++)
    {
        parc(v[i]);
        for(int j = 0; j<= k; j++)
        {
            dst[i][j] = dist[v[j]];
            //g<<dst[i][j]<<" ";
        }
        //g<<"\n";
    }
    int nst = (1<<(k+1));

    for(int i = 0; i<=k; i++)
    {
        for(int j = 0; j< nst; j++)
        {
            mat[i][j] = INF;
        }
    }
    mat[0][1] = 0;
    for(int i = 1; i < nst; i++)
    {
        for(int bit = 0; bit <= k; bit++)
        {
            if((i & (1<<bit)) != 0)
            {
                for(int bit1 = 0; bit1 <= k; bit1++)
                {
                    if((i & (1<<bit1))!=0 && (bit1 != bit))
                    {
                        //g<<mat[bit][i]<<" "<<mat[bit][(i ^ (1<<bit))]<<" | "<<(i ^ (1<<bit))<<" "<<bit1<<" "<<i<<"\n";
                        mat[bit][i] = min(mat[bit][i], mat[bit1][i ^ (1<<bit)] + dst[bit1][bit]);

                    }
                }
                //g<<"\n";
            }
        }
    }
    g<<mat[k][nst-1];
    f.close();
    g.close();
    return 0;
}