Cod sursa(job #1858304)

Utilizator KronSabau Valeriu Kron Data 27 ianuarie 2017 13:01:40
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <vector>
#define Nmax  2010
#define Kmax 18
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

int n,m,k;
const int INF=1<<30;
vector <pair<int,int> > adj[Nmax];
int dist[Kmax][Nmax],stops[Kmax],dp[Kmax][1<<Kmax],distk[Kmax][Kmax],indx[Nmax];

void dijkstra(int v,int d[])
{
    priority_queue <pair<int,int>,vector<pair<int,int> >, greater<pair<int,int> > > pq;
    for(int i=0;i<=n;i++)
        d[i]=INF;
    d[v]=0;
    pq.push(make_pair(d[v],v));
    int cost,w,cost2;
    while(!pq.empty())
    {
        v=pq.top().second;
        cost=pq.top().first;
        pq.pop();

        for(int i=0;i<adj[v].size();i++)
        {
            cost2=adj[v][i].first;
            w=adj[v][i].second;
            if(d[w]>cost2+cost)
            {
                d[w]=cost2+cost;
                pq.push(make_pair(d[w],w));
            }
        }
    }

    for(int i=1;i<=n;i++)
    {
        if(i!=v && indx[i])
        {
            distk[indx[i]-1][indx[v]-1]=d[i];
            distk[indx[v]-1][indx[i]-1]=d[i];
        }
    }
}
int main()
{
    int val;
    f >> n >> m >> k;
    for(int i=1;i<=k;i++){
        f>> val;
        stops[i+1]=val;
        indx[val]=i+1;
    }
    indx[1]=1;
    indx[n]=k+2;
    stops[1]=1;
    stops[k+2]=n;
    int x,y,c;
    for(int i=0;i<m;i++)
    {
        f>> x >> y >> c;
        adj[x].push_back(make_pair(c,y));
        adj[y].push_back(make_pair(c,x));
    }
   int N=k+2;
    for(int i=1;i<=N;i++)
    {
        dijkstra(stops[i],dist[i]);
        /*for(int j=1;j<=n;j++)
        {
            if(j!=stops[i] && indx[j]!=0)
            {
                distk[indx[i]-1][indx[stops[i]]-1]=dist[i][j];
                distk[indx[stops[i]]-1][indx[i]-1]=dist[i][j];
            }
        }*/
    }

   for(int i=0;i<(1<<N);i++)
        for(int j=0;j<=N;j++)
            dp[i][j]=INF;

    vector<int> a[Kmax];
    for(int i=0;i<=N;i++)
        for(int j=0;j<=N;j++)
            if(i!=j)
                a[i].push_back(j);
    dp[1][0]=0;
    for (int i = 0; i < 1 << N; ++i)
        for (int j = 0; j < N; ++j)
            if (i & (1<<j))
                for (int k = 0; k < a[j].size(); ++k)
                    if (i & (1<<a[j][k]))
                        dp[i][j] = min(dp[i][j], dp[i ^ (1<<j)][ a[j][k] ] + distk[ a[j][k] ][j]);

    g << dp[(1<<N)-1][N-1];
    cout << dp[1][0] <<"\n";
    for (int i = 0; i < (1 << N); ++i){
        for (int j = 0; j < N; ++j)
            cout << dp[i][j] << " ";
        cout << "\n";
    }
    return 0;
}