Pagini recente » Cod sursa (job #413282) | Cod sursa (job #718551) | Istoria paginii runda/garbotei1 | Cod sursa (job #2566695) | Cod sursa (job #2165726)
#include <bits/stdc++.h>
std::ifstream in("ubuntzei.in");
std::ofstream out("ubuntzei.out");
using namespace std;
const int MAX = 2000;
int st [ MAX + 1 ];
int ST[MAX];
int countt = 0;
int Matrix [ MAX + 1 ][ MAX + 1 ];
int N,M,K;
int V[ MAX + 1 ];
int Answer = ( 1<< 20);
inline void scanDATA()
{
in >> N >> M >> K;
for ( int i = 1; i <= K ; ++i)
in >> V[i];
for ( int i = 1; i <= N ; ++i)
for ( int j = 1; j <= N ; ++j)
if( i == j) Matrix[i][j] = 0;
else Matrix[i][j] = (1<<20);
for ( int i = 1; i <= M ; ++i)
{
int x,y,price;
in >> x >> y >> price;
Matrix[x][y] = price;
Matrix[y][x] = price;
}
}
void print(int nivel)
{
int NR = 0;
NR+=Matrix[1][st[1]];
for ( int i = 1; i < nivel ; ++i)
NR+=Matrix[st[i]][st[i+1]];
NR += Matrix[st[nivel]][N];
if(NR < Answer)
Answer= NR;
}
bool valid(int nivel)
{
for(int i=1;i<=nivel-1;++i)
if(st[i]==st[nivel])
return false;
return true;
}
void backtr(int nivel)
{
for(int i=1;i<=K;++i)
{
st[nivel]=V[i];
if(valid(nivel))
{
if(nivel==K)
{
print(nivel);
}
else
{
backtr(nivel+1);
}
}
}
}
void Floyd()
{
for ( int k = 1; k <= N ; ++k)
for ( int i = 1; i <= N ; ++i)
for ( int j = 1 ; j <= N ; ++j)
if( i != j)
if(Matrix[i][j] > Matrix[i][k] + Matrix[k][j])
Matrix[i][j] = Matrix[i][k] + Matrix[k][j];
}
int main()
{
scanDATA();
Floyd();
if( K == 0)
out << Matrix[1][N];
else
{
backtr(1);
/* for ( int i = 1; i <= N ; ++i)
{for ( int j = 1; j <= N ; ++j)
cout << Matrix[i][j] <<" ";
cout << endl;}*/
out << Answer;
}
}