Cod sursa(job #1247309)

Utilizator andreey_047Andrei Maxim andreey_047 Data 22 octombrie 2014 16:52:51
Problema Ubuntzei Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include <cstdio>
#define in "ubuntzei.in","r",stdin
#define out "ubuntzei.out","w",stdout
#define nmax 2005
#define Maxx 10005
#define kmax 1<<16
#define INF 9999999
#include <vector>
using namespace std;
int n,nr,u[20],m,dp[nmax][nmax],C[kmax][20];
vector<pair<int,int> >G[Maxx];
inline void djikstra(int x){
    int i,k,j,Q[Maxx];
    for(j=1;j<=n;j++)
         dp[x][j] = INF;
    dp[x][x] = 0;
    Q[1]=x;
    k=1;
    for(i=1;i<=k;i++)
        for(j=0;j<G[Q[i]].size();j++)
    if(dp[x][G[Q[i]][j].first]==INF||(dp[x][G[Q[i]][j].first] > dp[x][Q[i]]+G[Q[i]][j].second)){
        Q[++k]=G[Q[i]][j].first;
        dp[x][Q[k]]=dp[x][Q[i]]+G[Q[i]][j].second;
    }
}
inline void solve(){
 int i,j,q,best;
 for(i=0;i<(1<<nr);i++)
    for(j=1;j<=nr;j++)
     C[i][j] = INF;
  for(i=1;i<=nr;i++)
        C[1<<(i-1)][i] = dp[u[i]][1];
  for(i=0;i<(1<<nr);i++)
    for(j=1;j<=nr;j++)
     for(q=1;q<=nr;q++){
        C[i][j]=min(C[i][j],C[i^(1<<(j-1))][q]+dp[u[q]][u[j]]);
        }
  best=INF;
 for(i=1;i<=nr;i++)
   best=min(best,C[(1<<nr)-1][i]+dp[u[i]][n]);
   if(!nr) best = dp[1][n];
    cout << best<<'\n';
}
int main(){
    int i,x,y,c;
    freopen(in);
    freopen(out);
    scanf("%d%d%d",&n,&m,&nr);
    for(i=1;i<=nr;i++) {scanf("%d",&x);u[i]=x;}
    for(i=1;i<=m;i++){
        scanf("%d%d%d",&x,&y,&c);
        G[x].push_back(make_pair(y,c));
        G[y].push_back(make_pair(x,c));
    }

    djikstra(1);
    for(i=1;i<=nr;i++) djikstra(u[i]);
    solve();
    return 0;
}