Cod sursa(job #2700618)

Utilizator marinaoprOprea Marina marinaopr Data 28 ianuarie 2021 11:45:21
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <stdio.h>
#include <vector>
#include <utility>
#include <queue>
#define NMAX 2005
#define INF 1e9
using namespace std;
FILE *fin = fopen("ubuntzei.in", "r");
FILE *fout = fopen("ubuntzei.out", "w");
vector <pair <int,int> > graf[NMAX];
vector <vector <int> > d,dp;
vector <int> trb,D;
int n,m,k,i,j,x,y,c,mask,ans;
void dijkstra(int start, vector <int> &dist)
{
	priority_queue <pair<int, int> > q;
    int nod,lg,i;
    q.push(make_pair(0, start));
    dist.assign(n+1, INF);
    dist[start]=0;
    while(!q.empty())
    {
        nod = q.top().second;
        lg =- q.top().first;
        if(dist[nod]==lg){
        for(i=0; i<graf[nod].size(); ++i)
            if(lg+graf[nod][i].second < dist[graf[nod][i].first])
            {
                dist[graf[nod][i].first] = lg+graf[nod][i].second;
                q.push(make_pair(-dist[graf[nod][i].first], graf[nod][i].first));
            }
        }
        q.pop();
    }
}

int main()

{
    fscanf(fin, "%d%d%d", &n,&m,&k);
    trb.resize(k);
    for(i=0; i<=k-1; ++i)
        fscanf(fin, "%d", &trb[i]);
    for(i=1; i<=m; ++i)
    {
        fscanf(fin, "%d%d%d", &x,&y,&c);
        graf[x].push_back(make_pair(y,c));
        graf[y].push_back(make_pair(x,c));
    }

    D.resize(n);
    dijkstra(1, D);
       if(k==0) fprintf(fout,"%d",D[n]);
       else {
    d.resize(k);
    for(i=0; i<=k-1; ++i)
        dijkstra(trb[i], d[i]);

    dp.assign(1<<k, vector <int> (k, INF));
    for(i=0; i<=k-1; ++i)
        dp[1<<i][i] = D[trb[i]];
    for(mask=1; mask<=(1<<k)-1; ++mask)
        for(i=0; i<=k-1; ++i)
            if(mask & (1<<i))
                for(j=0; j<=k-1; ++j)
                    if(i!=j and mask & (1<<j) and dp[mask ^ (1<<i)][j] + d[i][trb[j]] < dp[mask][i])
                        dp[mask][i] = dp[mask ^ (1<<i)][j] + d[i][trb[j]];

    ans = INF;
    for(i=0; i<=k-1; ++i)
        ans = min(ans, dp[(1<<k) - 1][i]+d[i][n]);
    fprintf(fout, "%d", ans);
       }
    fclose(fin);
    fclose(fout);
    return 0;
}