Pagini recente » Cod sursa (job #722417) | Cod sursa (job #131912) | Cod sursa (job #2820716) | Cod sursa (job #1518263) | Cod sursa (job #2999944)
#include <iostream>
#include <fstream>
#define INTMAX 10000
using namespace std;
ifstream f("date.in");
int n, m, k;
int v[100], dist[100], a[100][100];
int dp[1<<15][15];
bool sptSet[100];
void afisare(int V[100], int N)
{
for(int i = 1; i <= N; i++)
cout<<V[i]<<" ";
cout<<endl;
}
int minDist()
{
int mini = INTMAX, nodMin;
for(int i = 1; i <= n; i++)
{
if(mini > dist[i] && sptSet[i] == false)
{
mini = dist[i];
nodMin = i;
}
}
return nodMin;
}
void dijkstra(int nod, int V[100])
{
for(int i = 1; i <= n; i++)
dist[i] = INTMAX, sptSet[i] = false;
dist[nod] = 0;
for(int contor = 1; contor < n; contor++)
{
int curent = minDist();
sptSet[curent] = true;
for(int i = 1; i <= n; i++)
{
if(sptSet[i] == false && dist[i] > dist[curent] + a[curent][i] && a[curent][i])
dist[i] = dist[curent] + a[curent][i];
}
}
for(int i = 1; i <= n; i++)
V[i] = dist[i];
}
int main()
{
f>>n>>m;
f>>k;
for(int i = 0; i < k; i++)
f>>v[i];
for(int i = 0; i < m; i++)
{
int x, y, d;
f>>x>>y>>d;
a[x][y] = a[y][x] = d;
}
int path[100][100] = {0};
dijkstra(1, path[1]);
for(int i = 0; i < k; i++)
dijkstra(v[i], path[i]);
for(int i = 1; i < (1<<k); i++)
{
int j = 0;
for(j = 0; j < k; j++)
if(i == (1<<j))
break;
if(i == (1<<j) && j < k)
{
dp[i][j] = path[1][v[j]];
continue;
}
for(j = 0; j < k; j++)
{
dp[i][j] = INTMAX;
if(i & (1<<j)) {
for(int t = 0; t < k; t++)
{
if(t != j && (i & (1<<t)))
dp[i][j] = min(dp[i][j], dp[i - (1<<j)][t] + path[t][v[j]]);
}
}
}
}
int mini = INTMAX;
for(int i = 0; i < k; i++)
{
mini = min(mini, dp[(1<<k) - 1][i] + path[i][n]);
}
for(int i = 0; i < k; i++)
{
for(int j = 1; j <= n; j++)
cout<<path[i][j]<<" ";
cout<<endl;
}
cout<<endl<<mini;
}