Cod sursa(job #1106593)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 12 februarie 2014 22:09:19
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#define inf 0xffffffff
#define put2(k) (1<<(k))
#define minim(a,b) (a<b)?(a):(b)
using namespace std;

struct muchie {
    int n,d;
};

struct comp {
    bool operator()(muchie &a,muchie &b) {
        return (a.d > b.d);
    }
};

vector <muchie> v[2005];
priority_queue <muchie,vector<muchie>,comp> q;
vector <muchie> :: iterator it;
int dist[20][20];
unsigned a[66000][18];
bool viz[2005];
int u[20];
int n,m,k;

inline muchie mkmuc(int n, int d) {
    muchie nou;
    nou.n = n;
    nou.d = d;
    return nou;
}

inline unsigned int cautbin(int v) {
    int s=0,f=k+1;
    while (s<=f) {
        int mij = (s+f)/2;
        if (u[mij] == v) return mij;
        if (u[mij] < v) s = mij+1;
        else f = mij-1;
    }
    return inf;
}

void distance(int p,int nod,int v) {
    unsigned int x = cautbin(nod);
    if (x != inf) dist[x][p] = dist[p][x] = v;
}

void dijkstra(int s) {
    q.push(mkmuc(u[s],0));
    for (int i=0;i<=n;i++) viz[i] = false;
    while (!q.empty()) {
        muchie nod = q.top(); q.pop();
        if (viz[nod.n]) continue;
        viz[nod.n] = true;
        distance(s,nod.n,nod.d);
        for (it = v[nod.n].begin();it!=v[nod.n].end();it++) {
            muchie muc = *it;
            if (viz[muc.n]) continue;
            q.push(mkmuc(muc.n,nod.d+muc.d));
        }
    }
}

unsigned int memoi() {
    for (int i=1;i<=put2(k+2)-1;i++) {
        for (int j=0;j<=k+1;j++) {
            if ((i & put2(j)) != 0 && i != put2(j)) {
                for (int l=0;l<=k+1;l++) {
                    if ((i & put2(j)) != 0 && i != put2(l)) if (a[i^put2(j)][l] != inf)
                        a[i][j] = minim(a[i][j],a[i^put2(j)][l]+dist[l][j]);
                        //a[i|put2(l)][l] = minim(a[i|put2(l)][l],a[i][j]+dist[j][l]);
                }
            }
        }
    }
    return a[put2(k+2)-1][k+1];
}

int main() {
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    for (int i=0;i<=19;i++) for (int j=0;j<=19;j++) a[i][j] = inf;
    a[1][0] = 0;
    scanf("%d %d %d",&n,&m,&k);
    u[0] = 1; u[k+1] = n;
    for (int i=1;i<=k;i++) scanf("%d",&u[i]);
    sort(u+1,u+k+1);
    for (int i=1;i<=m;i++) {
        int a,b,c;
        scanf("%d %d %d",&a,&b,&c);
        v[a].push_back(mkmuc(b,c));
        v[b].push_back(mkmuc(a,c));
    }
    for (int i=0;i<=k;i++) dijkstra(i);
    printf("%u\n",memoi());
    return 0;
}