Pagini recente » Cod sursa (job #2493005) | Cod sursa (job #673379) | Cod sursa (job #474015) | Cod sursa (job #2392693) | Cod sursa (job #1761392)
#include <fstream>
#include <climits>
using namespace std;
void dijkstra (unsigned short int K);
unsigned short int N, M;
unsigned short int K;
unsigned short int C[16];
unsigned short int x[10001], y[10001];
unsigned int z[10001];
unsigned int matrix[33000][16];
unsigned int dist[2001][2001];
unsigned int minimum;
unsigned int i, j, w;
unsigned long int L;
int main ()
{
ifstream fin ("ubuntzei.in");
fin >> N >> M;
fin >> K;
for (i=0; i<K; i++)
fin >> C[i];
for (i=1; i<=M; i++)
fin >> x[i] >> y[i] >> z[i];
fin.close();
minimum = UINT_MAX;
if (K > 0)
{
for (i=0; i<K; i++)
dijkstra(C[i]);
for (i=1; i<(1<<K); i++)
for (j=0; j<K; j++)
matrix[i][j] = UINT_MAX;
for (i=0; i<K; i++)
matrix[(1<<i)][i] = dist[1][C[i]];
for (i=1; i<(1<<K); i++)
for (j=0; j<K; j++)
if (i & (1<<j))
{
for (w=0; w<K; w++)
if (w != j && (i & (1<<w)))
matrix[i][j] = min(matrix[i][j],matrix[i^(1<<j)][w]+dist[C[w]][C[j]]);
}
for (i=0; i<K; i++)
if (matrix[(1<<K)-1][i] + dist[C[i]][N] < minimum)
minimum = matrix[(1<<K)-1][i] + dist[C[i]][N];
L = minimum;
}
else
{
dijkstra(N);
L = dist[1][N];
}
ofstream fout ("ubuntzei.out");
fout << L;
fout.close();
return 0;
}
void dijkstra (unsigned short int K)
{
unsigned short int i;
bool okay;
unsigned int dist1[2001];
for (i=1; i<=N; i++)
dist1[i] = UINT_MAX;
dist1[K] = 0;
okay = 1;
while (okay)
{
okay = 0;
for (i=1; i<=M; i++)
{
if (dist1[x[i]] < UINT_MAX)
if (dist1[x[i]] + z[i] < dist1[y[i]])
{
okay = 1;
dist1[y[i]] = dist1[x[i]] + z[i];
}
if (dist1[y[i]] < UINT_MAX)
if (dist1[y[i]] + z[i] < dist1[x[i]])
{
okay = 1;
dist1[x[i]] = dist1[y[i]] + z[i];
}
}
}
for (i=1; i<=N; i++)
dist[K][i] = dist[i][K] = dist1[i];
}