Cod sursa(job #2130427)

Utilizator pslaPislariu Alexandru psla Data 13 februarie 2018 18:05:27
Problema Ubuntzei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <fstream>
#define Nmax 2001
#define Kmax 15
#define INF 1050000
using namespace std;
int costuri[Nmax][Nmax];
void initializareMat(int N)
{
    for(int i=1;i<N;i++)
        for(int j=i+1;j<=N;j++)
        {
            costuri[i][j]=INF;
            costuri[j][i]=INF;
        }
}
void citire(int &N,int &M,int &K,int v[])
{
    ifstream in("ubuntzei.in");
    in>>N>>M;
    in>>K;
//retinem prietenii
    for(int i=1;i<=K;i++)
        in>>v[i];
//initializam matricea costurilor
    initializareMat(N);
//construim matricea costurilor
    int c1,c2,cost;
    for(int i=0;i<M;i++)
    {
        in>>c1>>c2>>cost;
        costuri[c1][c2]=cost;
        costuri[c2][c1]=cost;
    }
    in.close();
}
void Roy_Floyd(int N)
{
    for(int inter=1;inter<=N;inter++)
        for(int i=1;i<=N;i++)
        {
            if(costuri[i][inter]!=INF)
              for(int j=1;j<=N;j++)
                if(costuri[i][j]>costuri[i][inter]+costuri[inter][j])
                {
                    costuri[i][j]=costuri[i][inter]+costuri[inter][j];
                    costuri[j][i]=costuri[i][inter]+costuri[inter][j];
                }
        }
}
int Lmin=INF,L;
int st[Kmax];
bool bun(int v[],int pas)
{
    L=costuri[1][v[st[0]]];
    for(int i=0;i<pas;i++)
    {
        if(st[i]==st[pas])return 0;
        L+=costuri[v[st[i]]][v[st[i+1]]];
    }
    return (L<Lmin);
}

void afis(int val)
{
    ofstream out("ubuntzei.out");
    out<<val<<'\n';
    out.close();
}
void BKT(int N,int K,int v[],int pas)
{
    for(int i=1;i<=K;i++)
    {//in stiva retinem poziitile din vectorul de prieteni
        st[pas]=i;
        if(bun(v,pas))
            if(pas==K-1)
            {
                L+=costuri[v[st[pas]]][N];
                if(L<Lmin)
                {
                    Lmin=L;
                    afis(L);
                }
            }
            else BKT(N,K,v,pas+1);
    }
}
void getL(int N,int K,int v[])
{
    if(K==0)
    {
        L=costuri[1][N];
        afis(L);
    }
    else
    {//caculam dintre toate posibilitatile distanta minima
    //toate traseele trebuie sa inceapa din Cluj(1) si sa se termine in Vama(N)
        BKT(N,K,v,0);
    }

}
int main()
{
    int N,M;//noduri/muchii
    int K,prieteni[Kmax];//prietenii Ubuntzeilor
    citire(N,M,K,prieteni);
//retinem costurile minime dintre oricare 2 Noduri
    Roy_Floyd(N);
//determinam lungimea
    getL(N,K,prieteni);
    return 0;
}