using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace graph5
{
class Program
{
static int n;//nr vf
static int[,] A;//matricea de adiacenta
static bool[] V;//vizitat/nevizitat
static int[] X;//vector solutie pt backtracking
static int[] H;//vector solutie - ciclul hamiltonian
static bool gasit;
static void back(int k)//caut cu backtracking un circuit hamiltonian
{
if (!gasit)//daca nu s-a gasit un circuit hamiltonian
{
for (int i = 1; i <= n; i++)
if (!V[i] && (A[X[k - 1],i]==1 || k == 1))//caut varful urmator din circuit
{
X[k] = i;//il plasez in solutie
V[i] = true;//il marchez ca folosit
if (k == n && A[X[n],X[1]]==1)//am pus toate n varfuri si de la ultimul pus exista arc la primul pus
{//este hamiltonian
gasit = true;
for (int j = 1; j <= n; j++) H[j] = X[j];//copiex pe X in H
}
else back(k + 1);//avansez la pozitia urmatoare
V[i] = false;//marchez varful ca nefolosit
}
}
}
static void Main(string[] args)
{
//citire
StreamReader fin = new StreamReader("graph.in");//deschide fisierul
n = int.Parse(fin.ReadLine());//citesc numarul de varfuri
int m = int.Parse(fin.ReadLine());//citesc numarul de arce
A = new int[n + 1, n + 1];//creez matrice a de adiacenta
V = new bool[n + 1];
X = new int[n + 1];
H = new int[n + 1];
for (int i = 0; i < m; i++)//citesc ne linii
{
string linie = fin.ReadLine();//o linie
string[] s = linie.Split();//o desparte in trei numere
int v1 = int.Parse(s[0]);//primul varf
int v2 = int.Parse(s[1]);//al doilea varf
A[v1, v2] = 1;//pun in matricea de adiacenta
A[v2, v1] = 1;
}
back(1);//pornesc cautarea din primul varf
if (gasit)
{
for (int i = 1; i <= n; i++) Console.Write(H[i] + " ");
Console.Write(H[1]);//ultimul varf
}
else Console.WriteLine("graful nu este hamiltonian"); ;
Console.ReadKey();
}
}
}
|