Cod sursa(job #1898361)

Utilizator medicinedoctoralexandru medicinedoctor Data 1 martie 2017 22:54:34
Problema Ciclu hamiltonian de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define INF 4231567890

using namespace std;

unsigned long long sol = INF, f = 0;
vector <vector <int> > a;
vector <int> q;

void read()
{
    ifstream cin("hamilton.in");
	int n, m;
	cin >> n >> m;
	a.resize(n);

	for (int i = 0; i < n; i++)
	{
		a[i].resize(n);
		for (int j = 0; j < n; j++)
			a[i][j] = -1;
	}

	for (int i = 0, x, y, q; i < m; i++)
        cin >> x >> y, cin >> a[x][y];

    cin.close();
}

void solve(int x)
{
	if (q.size() == a.size())
	{
		if (a[ q[q.size() - 1] ][f] == -1) return;
		for (int i = 0; i < q.size(); i++)
            if (count(q.begin(), q.end(), q[i]) > 1) return;

		unsigned long long y = a[ q[q.size() - 1] ][f];

		for (int i = 1; i < q.size(); i++)
			y += a[ q[i - 1] ][ q[i] ];
		sol = min(y, sol);
        return;
	}
	for (int i = 0; i < a.size(); i++)
		if (a[x][i] != -1)
		{
			q.push_back(i);
			solve(i);
			q.pop_back();
		}
}

int main()
{
	read();

	for (; f < a.size(); f++)
    {
        q.push_back(f);
        solve(f);
        q.pop_back();
    }

    ofstream cout("hamilton.out");

    if (sol == INF)
        cout << "Nu exista solutie";
    else cout << sol;

    cout.close();

	return 0;
}