Cod sursa(job #2166337)

Utilizator zhm248Mustatea Radu zhm248 Data 13 martie 2018 16:40:08
Problema Ubuntzei Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.85 kb
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
int put2(int x)
{
    int nr=1;
    for(int i=1;i<=x;++i)
    {
        nr*=2;
    }
    return nr;
}

bool det(int x,int k)
{
    for(int i=0;i<k;++i)
    {
        x-=(x%2);
        x/=2;
    }
    return x%2;
}

typedef pair<int,int>ii;
typedef pair<int,ii>iii;
int city[16],pcity[16];
vector<ii>g[2001];
vector<ii>dist[2001];
priority_queue<iii,vector<iii>,greater<iii> >pq;
int main()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    int n,m,k,i,x,y,z,minim=1000000000,j;
    scanf("%d%d%d",&n,&m,&k);
    for(i=1;i<=k;++i)
    {
        scanf("%d",&city[i]);
        pcity[city[i]]=i;
    }
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&z);
        g[x].push_back(ii(z,y));
        g[y].push_back(ii(z,x));
    }
    dist[1].push_back(ii(0,0));
    pq.push(iii(0,ii(1,0)));
    int kk=1,sum=0;
    for(i=0;i<k;++i)
    {
        sum+=kk;
        kk*=2;
    }
    while(!pq.empty()&&pq.top().first<=minim)
    {
        iii top=pq.top();
        pq.pop();
        int d=top.first,val1=top.second.first,val2=top.second.second;
        if(val1==n&&val2==sum)
        {
            if(minim>d)
                minim=d;
            continue;
        }
        int pozz;
        for(j=0;j<dist[val1].size();++j)
        {
            if(dist[val1][j].second==val2)
            {
                pozz=j;
                break;
            }
        }
        if(d==dist[val1][pozz].first)
        {
            for(i=0;i<g[val1].size();++i)
            {
                int v=g[val1][i].second;
                int dv=g[val1][i].first;
                if(pcity[v])
                {
                    if(!det(val2,pcity[v]-1))
                    {
                        int val3=val2+put2(pcity[v]-1);
                        int poz=-1;
                        for(j=0;j<dist[v].size();++j)
                        {
                            if(dist[v][j].second==val3)
                            {
                                poz=j;
                                break;
                            }
                        }
                        if(poz!=-1)
                        {
                            if(dist[v][poz].first>d+dv)
                            {
                                dist[v][poz].first=d+dv;
                                pq.push(iii(d+dv,ii(v,val3)));
                            }
                        }
                        else
                        {
                            dist[v].push_back(ii(d+dv,val3));
                            pq.push(iii(d+dv,ii(v,val3)));
                        }
                    }
                }
                else
                {
                    int pozzz=-1;
                    for(j=0;j<dist[v].size();++j)
                    {
                        if(dist[v][j].second==val2)
                        {
                            pozzz=j;
                            break;
                        }
                    }
                    if(pozzz!=-1)
                    {
                        if(dist[v][pozzz].first>d+dv)
                        {
                            dist[v][pozzz].first=d+dv;
                            pq.push(iii(d+dv,ii(v,val2)));
                        }
                    }
                    else
                    {
                        dist[v].push_back(ii(d+dv,val2));
                        pq.push(iii(d+dv,ii(v,val2)));
                    }
                }
            }
        }
    }
    for(i=0;i<dist[n].size();++i)
    {
        if(dist[n][i].second==sum)
        {
            printf("%d\n",dist[n][i].first);
            break;
        }
    }
    return 0;
}