Pagini recente » Cod sursa (job #597406) | Cod sursa (job #2145602) | Cod sursa (job #1829203) | Cod sursa (job #1224686) | Cod sursa (job #2130427)
#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;
}