Cod sursa(job #1902743)

Utilizator aaron72Armand Ioan Anusca Popa aaron72 Data 4 martie 2017 19:21:34
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <bits/stdc++.h>
#define nmax 2005
using namespace std;

int n,m,k;
vector <pair <int,int> > v[nmax];
set <pair <int,int> > st;
int dp[20][nmax];
int dist[nmax][nmax];
int city[20];


void Push(int nod,int cost,int loc){
    set <pair <int,int> >::iterator it=st.find(make_pair(dist[loc][nod],nod));
    if(it!=st.end()) st.erase(it);
    st.insert(make_pair(cost,nod));
    dist[loc][nod]=cost;
}

void Dijkstra(int loc,int dest){
    for(int i=0;i<=n;i++)
        dist[loc][i]=INT_MAX;
    Push(dest,0,loc);
    while(!st.empty()){
        int now=st.begin()->second;
        st.erase(st.begin());
        for(int i=0;i<v[now].size();i++){
            int cost=v[now][i].second;
            int next=v[now][i].first;
            if(dist[loc][next]>dist[loc][now]+cost)
                Push(next,dist[loc][now]+cost,loc);
        }
    }
}

int BTK(int now,int conf){
    if(conf==0)
        return dist[k][city[now]];
    if(dp[now][conf]<INT_MAX)
        return dp[now][conf];
    int pw=1;
    for(int i=0;i<k;i++,pw*=2)
        if(conf&pw){
            int val=BTK(i,conf-pw)+dist[city[i]][now];
            dp[now][conf]=min(dp[now][conf],val);
        }
}

int main()
{
    int x,y,cost;
    ios_base::sync_with_stdio(false);
    ifstream fin("ubuntzei.in");
    ofstream fout("ubuntzei.out");
    fin>>n>>m>>k;
    for(int i=0;i<k;i++)
        fin>>city[i];
    for(int i=0;i<m;i++){
        fin>>x>>y>>cost;
        v[x].push_back(make_pair(y,cost));
        v[y].push_back(make_pair(x,cost));
    }
    int lim=(1<<17);
    for(int i=0;i<=19;i++)
        for(int j=0;j<lim;j++)
            dp[i][j]=INT_MAX;
    for(int i=0;i<k;i++)
        Dijkstra(i,city[i]);
    Dijkstra(k,1);
    Dijkstra(k+1,n);
    if(k==0){
        fout<<dist[1][1];
        return 0;
    }
    int conf=(1<<k)-1;
    int mn=INT_MAX;
    bool ismn=true;
    for(int i=0;i<k;i++){
        int new_val=BTK(i,conf-(1<<i))+dist[city[i]][k+1];
        if(ismn||new_val<mn){
            mn=new_val;
            ismn=false;
        }
    }
    fout<<mn<<'\n';
    fout.close();
    fin.close();
    return 0;
}