Pagini recente » Cod sursa (job #265950) | Cod sursa (job #314892) | Cod sursa (job #647971) | Cod sursa (job #1968771) | Cod sursa (job #2305629)
#include<fstream>
#include<vector>
#include<algorithm>
#define inf 180000005
using namespace std;
ifstream in("hamilton.in");
ofstream out("hamilton.out");
const int Nmax = 20;
const int Vmax = 262150;
vector<int> A[Nmax];
int main()
{
int n, m, k, rez = inf;
in >> n >> m;
k = (1<<n);
vector<vector<int> > dp(Vmax, vector<int>(n + 1));
vector<vector<int> > cost(n + 1, vector<int>(n + 1));
for (int i = 0; i < n; i++)
for (int j = i; j < n; j++)
cost[i][j] = cost[j][i] = inf;
for (int i = 1; i <= m; i++)
{
int x, y, c;
in >> x >> y >> c;
A[y].push_back(x);
cost[x][y] = c;
}
for (int i = 1; i < k; i++)
for (int j = 0; j < n; j++)
dp[i][j] = inf;
dp[1][0] = 0;
for (int i = 1; i < k; i++)
for (int j = 0; j < n; j++)
if ((1<<j)&i)
for (auto w = 0; w < A[j].size(); w++)
{
int nod = A[j][w];
if ((1<<nod)&i)
dp[i][j] = min(dp[i][j], dp[i ^ (1<<j)][nod] + cost[nod][j]);
}
k--;
for (auto i = 0; i < A[0].size(); i++)
{
int nod = A[0][i];
rez = min(rez, dp[k][nod] + cost[nod][0]);
}
if (rez == inf)
out << "Nu exista solutie";
else
out << rez;
return 0;
}