Cod sursa(job #2453101)

Utilizator Stefan3002Stefan Stefan3002 Data 2 septembrie 2019 14:44:00
Problema Ubuntzei Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.83 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];
const int KMAX=18;
int dp[1<<KMAX][KMAX];
int mindist[KMAX][KMAX];
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 TSP(int masca,int poz){

if(masca==(1<<k)-1)
    return 0;

    if(dp[masca][poz]!=inf)
    return dp[masca][poz];

int minim=inf;
for(int i=0;i<=k-1;i++){
    if((masca&(1<<i))==0){
    int newans=mindist[poz][i]+TSP(masca|(1<<i),i);
    if(newans<minim)
        minim=newans;
    }

}

return dp[masca][poz]=minim;

}






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[i][j]=mindist[j][i]=dist[frd[j]];

                }
        }


        for(i=0; i<=(1<<k)-1; 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];
*/

        iesire<<TSP(1,0);

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








}