Cod sursa(job #1514904)

Utilizator elevenstrArina Raileanu elevenstr Data 31 octombrie 2015 19:43:46
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.78 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
#define mp(a,b) make_pair(a,b)
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
#define MIN(a,b) (a<b?a:b)
#define MAX1 10800
#define INF 92233720368547758
long long int dp[131072][18];
queue <long long int> Q;
vector <pair<long long int, long long  int> > v[MAX1];
vector < long long int> sp[20];
long long int n,k;
long long int c[MAX1],dist[MAX1],drum[2005][MAX1];

inline void bell(long long int nod,long long int y)
{
    for(int i=0; i<=MAX1; i++)
        dist[i]=INF;
    dist[nod]=0;
    Q.push(nod);
    while(!Q.empty())
    {
        int act=Q.front();
        Q.pop();
        for(vector <pair<long long int,long long int> > ::iterator it=v[act].begin(); it!=v[act].end(); it++)
        {
            if(dist[it->first]>dist[act]+it->second)
            {
                long long int ind=INF;
                for(int i=1; i<=k; i++)
                    if(c[i]==it->first)
                    {
                        ind=i;
                        break;
                    }
                if(ind!=INF)
                {
                    sp[y].push_back(ind);
                    drum[y][ind]=dist[act]+it->second;
                    sp[ind].push_back(y);
                    drum[ind][y]=dist[act]+it->second;
                }
                dist[it->first]=dist[act]+it->second;
                Q.push(it->first);
            }
        }
    }
}
int main()
{
    long long int i,j,m,l,x,a,b,d,mini=INF,s;
    in>>n>>m>>k;
    for(i=1; i<=k; i++)
    {
        in>>c[i];
    }
    for(i=1; i<=m; i++)
    {
        in>>a>>b>>d;
        v[a].push_back(mp(b,d));
        v[b].push_back(mp(a,d));
    }
    for (long long int i = 0; i < n+1; ++i)
        for (long long int j = 0; j < n+1; ++j) drum[i][j] = INF;


    if(k==0)out<<dist[n];
    else {  bell(1,0);
    int lama=dist[n];
    for(i=1; i<=k; i++)
        bell(c[i],i);
        bell(n,n);
    k=k+1;
    for (long long int i = 0; i <= (1 <<k); ++i)
        for (long long int j = 0; j <= k; ++j) dp[i][j] = INF;
    dp[1][0] = 0;
    for(i=1; i<=(1<<k)-1; i++)
        for(j=0; j<k; j++)
            if(i&1<<j)
            {
                for(vector<long long int> ::iterator it=sp[j].begin(); it!=sp[j].end(); ++it)
                    if(i&(1<<*it))
                        dp[i][j]=MIN(dp[i][j],dp[i^(1<<j)][*it]+drum[*it][j]);
                        if(i==(1<<k)-1) out<<dp[i][j]<<" ";
            }
      out<<dp[(1<<k)-1][0]<<" ";
      out<<lama<<" ";
       int s=INF;
   for(vector<long long int> ::iterator it=sp[n].begin(); it!=sp[n].end(); ++it)
        s=MIN(s,dp[(1<<k)-1][*it]+drum[*it][n]);
        out<<s<<" ";
    }

    return 0;
}