Cod sursa(job #968659)

Utilizator andrettiAndretti Naiden andretti Data 2 iulie 2013 15:05:03
Problema Ubuntzei Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<stdio.h>
#include<vector>
#define pb push_back
#define mp make_pair
#define maxn 2005
#define maxk 20
#define inf 999999999
using namespace std;

int n,m,nrc,dmin=inf;
int c[maxk],v[maxn],d[maxn],x[maxk],uz[maxn];
int a[maxn][maxn];
vector < pair<int,int> > l[maxn];

void cit()
{
    int i;
    int a,b,cost;

    scanf("%d%d%d",&n,&m,&nrc);
    for(i=1;i<=nrc;i++) scanf("%d",&c[i]);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&cost);
        l[a].pb(mp(b,cost));
        l[b].pb(mp(a,cost));
    }
}

void dijkstra(int nod)
{
    int i1,i,j;
    int minn,k;

    for(i=1;i<=n;i++) { d[i]=inf; v[i]=0; }
    d[nod]=0;

    for(i1=1;i1<=n;i1++)
    {
        minn=inf;
        for(j=1;j<=n;j++)
         if(v[j]==0 && minn>d[j])
         {
             minn=d[j];
             k=j;
         }

         v[k]=1;
         for(unsigned int i=0;i<l[k].size();i++)
          if(v[l[k][i].first]==0 && d[k]+l[k][i].second<d[l[k][i].first])
            d[l[k][i].first]=d[k]+l[k][i].second;
    }
}

void drum()
{
    int i,j;

    dijkstra(1); for(i=1;i<=n;i++) a[1][i]=d[i];
    for(i=1;i<=nrc;i++)
    {
        dijkstra(c[i]);
        for(j=1;j<=n;j++) a[c[i]][j]=d[j];
    }
}

void update()
{
    int i;
    int s=0;
    for(i=1;i<nrc;i++)
     s+=a[x[i]][x[i+1]];

    s+=a[1][x[1]]+a[x[nrc]][n];
    if(dmin>s) dmin=s;
}

void back(int k)
{
    int i;
    if(k>nrc) update();
    else
     for(i=1;i<=nrc;i++)
      if(uz[c[i]]==0)
      {
          x[k]=c[i];
          uz[c[i]]=1;
          back(k+1);
          uz[c[i]]=0;
      }
}

int main()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);

    cit();
    drum();
    back(1);
    printf("%d",dmin);

    fclose(stdin);
    fclose(stdout);
    return 0;
}