Cod sursa(job #1037525)

Utilizator assa98Andrei Stanciu assa98 Data 20 noiembrie 2013 12:35:21
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;

struct pe{
    int a,b;
    pe() {
        a=b=0;
    }
    pe(int _a,int _b) {
        a=_a;
        b=_b;
    }
};

class cmp {
public:
    inline bool operator () (const pe &a,const pe &b) {
        return a.b>b.b;
    }
};

const int MAX_N=2100;
const int INF=(1<<30);
const int MAX_K=15;

int n;
vector<pe> A[MAX_N];
int d[20][MAX_N];
int viz[MAX_N];

vector<int> K;


priority_queue<pe,vector<pe>,cmp> Q;
void dijkstra(int start,int d[MAX_N]) {
    for(int i=1;i<=n;i++) {
        d[i]=INF;
        viz[i]=0;
    }
    Q.push(pe(start,0));
    d[start]=0;
    while(!Q.empty()) {
        int nod=Q.top().a;
        int cost=Q.top().b;
        if(!viz[nod]) {
            for(vector<pe>::iterator it=A[nod].begin(); it!=A[nod].end(); it++) {
                if(!viz[it->a]) {
                    if(d[it->a]>cost+it->b) {
                        d[it->a]=cost+it->b;
                        Q.push(pe(it->a,d[it->a]));
                    }
                }
            }
        }
        viz[nod]=1;
        Q.pop();
    }
}

int dp[MAX_K+3][(1<<MAX_K)+500];
int dinamic(int k) {
    for(int i=0;i<k;i++) {
        for(int j=0;j<(1<<k);j++) {
            dp[i][j]=INF;
        }
    }
    for(int i=0;i<k;i++) {
        dp[i][(1<<i)]=d[0][K[i+1]];
    }

    for(int j=1;j<(1<<k);j++) {
        for(int i=0;i<k;i++) {
            if(j&(1<<i)) {
                for(int b=0;b<k;b++) {
                    if(!(j&(1<<b))) {
                        dp[b][j^(1<<b)]=min(dp[b+1][j^(1<<b)],dp[i][j]+d[i+1][K[b+1]]);
                    }
                }
            }
        }
    }

    
    int ans=INF;
    for(int i=0;i<k;i++) {
        ans=min(ans,dp[i][(1<<k)-1]+d[i+1][n]);
    }
    return ans;
}

int main() {
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    int m;
    scanf("%d%d",&n,&m);
    
    K.push_back(1);
    int k;
    scanf("%d",&k);
    for(int i=1;i<=k;i++) {
        int a;
        scanf("%d",&a);
        K.push_back(a);
    }

    for(int i=1;i<=m;i++) {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        A[a].push_back(pe(b,c));
        A[b].push_back(pe(a,c));
    }

    for(int i=0;i<=k;i++) {
        dijkstra(K[i],d[i]);
    }
    printf("%d",dinamic(k));
    
    return 0;
}