Cod sursa(job #2453081)

Utilizator Stefan3002Stefan Stefan3002 Data 2 septembrie 2019 13:52:17
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <iostream>
#include <fstream>
#include <functional>
#include <vector>
#include <queue>

using namespace std;
ifstream intrare("ubuntzei.in");
ofstream iesire("ubuntzei.out");
const int NMAX=2005;
priority_queue < int, vector < int >, greater< int > >c;
vector < pair <int,  int > >graf[NMAX];
int vizitat[NMAX],i,j,n,m,k;
int frd[NMAX];
int dp[1<<18][18];
int mindist[18][18];
const int inf=(1<<30);
int dist[NMAX];

void dijkstra(int x){

for(i=1;i<=n;i++){
    vizitat[i]=false;
    dist[i]=inf;
}
vizitat[x]=true;
dist[x]=0;
c.push(x);

while(!c.empty()){
    int nod=c.top();
    c.pop();
    vizitat[nod]=false;
    for(size_t i=0;i<graf[nod].size();i++){
        int vecin=graf[nod][i].first;
        int cost=graf[nod][i].second;
        int costnou=dist[nod]+cost;
        if(costnou<dist[vecin]){
            dist[vecin]=costnou;
            if(!vizitat[vecin]){
                vizitat[vecin]=true;
                c.push(vecin);
            }
        }
    }



}




}





int main(){
    intrare>>n>>m>>k;
    for(i=1;i<=k;i++)
        intrare>>frd[i];
    for(i=1;i<=m;i++){
        int a,b,c;
        intrare>>a>>b>>c;
        graf[a].push_back(make_pair(b,c));
        graf[b].push_back(make_pair(a,c));
    }

   if(k!=0){
        frd[0]=1;
   frd[k+1]=n;
   k+=2;
   for(int i=0;i<k;i++){
        dijkstra(frd[i]);
        for(j=i+1;j<=k;j++)
            if(i!=j)
        {
            mindist[frd[i]][frd[j]]=dist[frd[j]];
            mindist[frd[j]][frd[i]]=dist[frd[j]];
        }
   }


    for(i=0;i<(1<<k);i++)
        for(j=0;j<k;j++)
            dp[i][j]=inf;



    dp[1][0]=0;
    for(int masca=1;masca<(1<<k);masca+=2)
        for(i=0;i<k;i++){
            if(masca&(1<<i))
            for(int z=0;z<k;z++)
            if(i!=z && (masca&(1<<z))){
            dp[masca][i]=min(dp[masca][i],dp[masca^(1<<i)][z]+mindist[frd[i]][frd[z]]);


    }
        }

iesire<<dp[(1<<k)-1][k-1];

   }
   else{
    dijkstra(1);
    iesire<<dist[n];
   }








}