Cod sursa(job #1116617)

Utilizator teo.serbanescuTeo Serbanescu teo.serbanescu Data 22 februarie 2014 18:30:08
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <string.h>
#include <queue>

using namespace std;

fstream f("ubuntzei.in",ios::in);
fstream g("ubuntzei.out",ios::out);

const int kmax=20,nmax=2005;
const long long INF=0x3f3f3f3f;

vector < pair<int, int> > a[nmax];

long long d[kmax][kmax],minim;
int n,m,k,x,y,z,nc,i,j,tr[kmax],pr[kmax];

void citire()
{
    f>>n>>m;
    f>>k;
    for (i=1;i<=k;i++) f>>pr[i];
    for (i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        a[x].push_back(make_pair(y,z));
        a[y].push_back(make_pair(x,z));
    }

}

void dijkstra(int p)
{
    long long dist[nmax];
    int viz[nmax];
    memset(dist,INF,sizeof(dist));
    memset(viz,0,sizeof(viz));
    queue <int> q;
    q.push(nc);
    dist[nc]=0;
    viz[nc]=1;
    while (!q.empty())
    {
        nc=q.front();
        q.pop();
        viz[nc]=0;
        for (vector< pair <int,int> >::iterator it=a[nc].begin();it!=a[nc].end();++it)
            if (dist[nc]+it->second<dist[it->first])
            {
                dist[it->first]=dist[nc]+it->second;
                if(!viz[it->first])
                {
                    viz[it->first]=1;
                    q.push(it->first);
                }
            }
    }
    for (j=1;j<=k;j++)
    {
        d[p][j+1]=dist[pr[j]];
        d[j+1][p]=dist[pr[j]];
    }
    d[p][k+2]=dist[n];
    d[k+2][p]=dist[n];
}

void calcul(long long s,int loc,int parc,int trec[kmax])
{
    if (parc==k+1)
    {
        if (s+d[loc][k+2]<minim) minim=s+d[loc][k+2];
    }
    else  for (j=2;j<=k+1;j++) if ((loc!=j)&&(!trec[j]))
    {
        trec[j]=1;
        calcul(s+d[loc][j],j,parc+1,trec);
        trec[j]=0;
    }
}


int main()
{
    citire();
    for (i=1;i<=k+2;i++)
        for (j=1;j<=k+2;j++) d[i][j]=0;

    nc=1;
    dijkstra(1);
    for (i=1;i<=k;i++) {
                        nc=pr[i];
                        dijkstra(i+1);
                        }
    minim=INF;
    for (i=1;i<=k+2;i++) tr[i]=0;
    tr[1]=1;
    calcul(0,1,1,tr);
    g<<minim;
    f.close();g.close();
    return 0;
}