Cod sursa(job #791841)

Utilizator geniucosOncescu Costin geniucos Data 25 septembrie 2012 16:38:14
Problema Ubuntzei Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include<fstream>
#include<cstring>
using namespace std;
int i1,nr,p,mini,x1,y1,c1,ul,i,j,k,n,m,v[20],c[2003][2003],d[20][20],ap[2003],b[2003],a[1<<15][17];
int min(int a,int b)
{
    if(a<b) return a;
    return b;
}
char a1[100];
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int main()
{
/*freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d",&n);
scanf("%d",&m);
scanf("%d",&k);*/
f>>n>>m>>k;
for(i=1;i<=k;i++)
    f>>v[i];
    //scanf("%d",&v[i]);
for(i1=1;i1<=m;i1++)
{
    /*scanf("%d",&x1);
    scanf("%d",&y1);
    scanf("%d",&c1);*/
    f>>x1>>y1>>c1;
    c[x1][y1]=c1;
    c[y1][x1]=c1;
}
v[0]=1;
for(i=0;i<=k;i++)
{
    ul=v[i];
    for(j=1;j<=n;j++)
    {
        b[j]=-1;
        ap[j]=0;
    }
    b[ul]=0;
    ap[ul]=1;
    while(1)
    {
        for(j=1;j<=n;j++)
            if(c[ul][j]!=0&&(b[ul]+c[ul][j]<b[j]||b[j]==-1))
                b[j]=b[ul]+c[ul][j];
        mini=999999;
        for(j=1;j<=n;j++)
            if(b[j]<mini&&ap[j]==0&&b[j]!=-1)
            {
                mini=b[j];
                ul=j;
            }
        if(mini==999999) break;
        ap[ul]=1;
    }
    for(j=1;j<=k;j++)
        d[i][j]=b[v[j]];
    d[i][k+1]=b[n];
}
if(k==0)
{
    printf("%d\n",d[0][1]);
    return 0;
}
/*for(i=0;i<=k;i++)
{
    for(j=1;j<=k+1;j++)
        printf("%d ",d[i][j]);
    printf("\n");
}*/
//a[i][j]=configuratia i, ultima j
for(i=1;i<(1<<k);i++)
    for(j=0;j<k;j++)
        if(i&(1<<j))
            a[i][j+1]=99999999;
for(i=1;i<(1<<k);i++)
    for(j=0;j<k;j++)
        if(i&(1<<j))
        {
            if((i&(i-1))==0&&d[0][j+1]!=-1) a[i][j+1]=d[0][j+1];
            for(p=1;p<=k;p++)
                if((i&(1<<(p-1)))==0&&p!=j+1&&d[j+1][p]!=-1) a[i+(1<<(p-1))][p]=min(a[i+(1<<(p-1))][p],a[i][j+1]+d[j+1][p]);
        }
mini=99999999;
for(j=1;j<=k;j++)
    if(a[(1<<k)-1][j]+d[j][k+1]>0&&d[j][k+1]!=-1&&a[(1<<k)-1][j]+d[j][k+1]<mini)
        mini=a[(1<<k)-1][j]+d[j][k+1];
//printf("%d\n",mini);
g<<mini;
return 0;
}