Cod sursa(job #829319)

Utilizator wzrdwzrd tst wzrd Data 5 decembrie 2012 01:11:59
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#define DN 2005
#define DK 20
#define x first
#define y second
#define mp make_pair
using namespace std;

typedef pair<int,int> per;
typedef vector<per>::iterator it;

int n,m,k,snod[DK],unde[DK],dmin[DK][DK],dist[DN],bst[DK][1<<DK];
vector<per> gr[DN];
queue<int> c;
bitset<DN> inq;

void dm(int s) {
    for(int i=1; i<=n; ++i) dist[i]=(1<<30);
    dist[snod[s]]=0;
    for(c.push(snod[s]);c.size();c.pop()) {
        int fr=c.front();
        inq[fr]=0;
        for(it i=gr[fr].begin(); i!=gr[fr].end(); ++i) if(dist[i->x]>dist[fr]+i->y) {
            dist[i->x]=dist[fr]+i->y;
            if(!inq[i->x]) {
                c.push(i->x);
                inq[i->x]=1;
            }
        }
    }
    for(int i=1; i<=n; ++i) if(unde[i]) dmin[s][unde[i]]=dist[i];
}

int main()
{
    ifstream f("ubuntzei.in");
    ofstream g("ubuntzei.out");
    f>>n>>m>>k;
    ++k;
    for(int i=2; i<=k; ++i) {
        f>>snod[i];
        unde[snod[i]]=i;
    }
    snod[1]=unde[1]=1;unde[1]=1; snod[++k]=n;unde[n]=k;
    for(int i=1; i<=m; ++i) {
        int a,b,c;
        f>>a>>b>>c;
        gr[a].push_back(mp(b,c));
        gr[b].push_back(mp(a,c));
    }
    for(int i=0; i<=k; ++i) for(int j=0; j<=k; ++j) dmin[i][j]=(1<<30);

    for(int i=1; i<=k; ++i) {
        dm(i);
        for(int s=0; s<=(1<<k); ++s) bst[i-1][s]=(1<<30);
    }

    bst[0][1]=0;
    for(int s=1; s<(1<<k); ++s) for(int i=0; i<k; ++i) if(s&(1<<i))
        for(int j=0; j<k; ++j) if(!(s&(1<<j))) {
            bst[j][s|(1<<j)]=min(bst[j][s|(1<<j)],bst[i][s]+dmin[i+1][j+1]);
            //cout<<s<<' '<<i<<' '<<j<<' '<<bst[i][s]<<' '<<bst[j][s|(1<<j)]<<'\n';
        }

    g<<bst[k-1][(1<<k)-1];
    cout<<bst[k-1][(1<<k)-1];
    return 0;
}