<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.algopedia.ro/wiki/index.php?action=history&amp;feed=atom&amp;title=Clasa_a_XI-a_lec%C8%9Bia_18</id>
	<title>Clasa a XI-a lecția 18 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.algopedia.ro/wiki/index.php?action=history&amp;feed=atom&amp;title=Clasa_a_XI-a_lec%C8%9Bia_18"/>
	<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_18&amp;action=history"/>
	<updated>2026-04-13T19:17:29Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_18&amp;diff=17448&amp;oldid=prev</id>
		<title>Bella at 10:03, 24 February 2020</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_18&amp;diff=17448&amp;oldid=prev"/>
		<updated>2020-02-24T10:03:02Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Graf Hamiltonian =&lt;br /&gt;
Definiție: Se numește &amp;#039;&amp;#039;&amp;#039;graf hamiltonian&amp;#039;&amp;#039;&amp;#039; un graf care conține un ciclu hamiltonian. Se numește &amp;#039;&amp;#039;&amp;#039;ciclu hamiltonian un ciclu elementar care conține toate vârfurile grafului&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Graful următor este hamiltonian. Un ciclu hamiltonian este: &lt;br /&gt;
[1,4,2,3,7,6,5,1]&lt;br /&gt;
&lt;br /&gt;
[[Image:graf-hamilton-euler.png]]&lt;br /&gt;
&lt;br /&gt;
Teoremă: Fie G un graf neorientat. Dacă are n≥3 vârfuri şi gradul oricărui vârf verifică inegalitatea d(x)≥n/2 atunci G este hamiltonian.&lt;br /&gt;
&lt;br /&gt;
== Aplicatii ==&lt;br /&gt;
===[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=548 Hamilton]===&lt;br /&gt;
Se dă un graf neorientat cu n vârfuri. Determinați, dacă există, un ciclu hamiltonian.&lt;br /&gt;
&lt;br /&gt;
==== Solutie Backtracking ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// Sol Pruteanu&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
const int NMAX=15;&lt;br /&gt;
&lt;br /&gt;
int a[NMAX][NMAX];&lt;br /&gt;
int viz[NMAX];&lt;br /&gt;
int sol[NMAX];&lt;br /&gt;
int n;&lt;br /&gt;
int ok = 0;&lt;br /&gt;
&lt;br /&gt;
void backtracking(int u,int cnt){&lt;br /&gt;
    if(ok==0){&lt;br /&gt;
        sol[cnt]=u;&lt;br /&gt;
        for(int v=1;v&amp;lt;=n;++v){&lt;br /&gt;
            if(a[u][v]==1 &amp;amp;&amp;amp; v==1 &amp;amp;&amp;amp; cnt==n){&lt;br /&gt;
                ok=1;&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if(a[u][v]==1 &amp;amp;&amp;amp; viz[v]==0){&lt;br /&gt;
                viz[v]=1;&lt;br /&gt;
                backtracking(v,cnt+1);&lt;br /&gt;
                viz[v]=0;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    freopen(&amp;quot;hamilton.in&amp;quot;,&amp;quot;r&amp;quot;,stdin);&lt;br /&gt;
    freopen(&amp;quot;hamilton.out&amp;quot;,&amp;quot;w&amp;quot;,stdout);&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;,&amp;amp;n);&lt;br /&gt;
    int u,v;&lt;br /&gt;
    while(scanf(&amp;quot;%d%d&amp;quot;,&amp;amp;u,&amp;amp;v)!=EOF){&lt;br /&gt;
        a[u][v]=1;&lt;br /&gt;
        a[v][u]=1;&lt;br /&gt;
    }&lt;br /&gt;
    viz[1]=1;&lt;br /&gt;
    backtracking(1,1);&lt;br /&gt;
    printf(&amp;quot;%d\n&amp;quot;,ok);&lt;br /&gt;
    if(ok==1){&lt;br /&gt;
        for(int i=1;i&amp;lt;=n;++i)&lt;br /&gt;
            printf(&amp;quot;%d &amp;quot;,sol[i]);&lt;br /&gt;
        printf(&amp;quot;%d&amp;quot;,sol[1]);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Solutie Dinamica ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;utility&amp;gt;&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;cstring&amp;gt;&lt;br /&gt;
#include &amp;lt;set&amp;gt;&lt;br /&gt;
#include &amp;lt;queue&amp;gt;&lt;br /&gt;
#include &amp;lt;map&amp;gt;&lt;br /&gt;
#include &amp;lt;stack&amp;gt;&lt;br /&gt;
#include &amp;lt;iomanip&amp;gt;&lt;br /&gt;
#define ll long long&lt;br /&gt;
#define lsb(x) (x &amp;amp; -x)&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
ifstream in(&amp;quot;hamilton.in&amp;quot;);&lt;br /&gt;
ofstream out(&amp;quot;hamilton.out&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
const int INF = 0;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
    int n;&lt;br /&gt;
    in &amp;gt;&amp;gt; n;&lt;br /&gt;
    vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; g(n);&lt;br /&gt;
    vector&amp;lt;int&amp;gt; aux;&lt;br /&gt;
    int x, y;&lt;br /&gt;
    while(in &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y) {&lt;br /&gt;
        x --;&lt;br /&gt;
        y --;&lt;br /&gt;
        g[x].push_back(y);&lt;br /&gt;
        g[y].push_back(x);&lt;br /&gt;
        if(y == 0 &amp;amp;&amp;amp; x != 0)&lt;br /&gt;
            aux.push_back(x);&lt;br /&gt;
        if(x == 0 &amp;amp;&amp;amp; y != 0)&lt;br /&gt;
            aux.push_back(y);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; dp((1 &amp;lt;&amp;lt; n), vector&amp;lt;int&amp;gt; (n, INF));&lt;br /&gt;
    vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; from((1 &amp;lt;&amp;lt; n), vector&amp;lt;int&amp;gt; (n, -1));&lt;br /&gt;
    dp[1][0] = 1;&lt;br /&gt;
&lt;br /&gt;
    for(int mask = 1; mask &amp;lt; (1 &amp;lt;&amp;lt; n); mask ++) {&lt;br /&gt;
        for(int i = 0; i &amp;lt; n; i ++) {&lt;br /&gt;
            if((mask &amp;amp; (1 &amp;lt;&amp;lt; i) == 0) || dp[mask][i] == INF)&lt;br /&gt;
                continue;&lt;br /&gt;
&lt;br /&gt;
            for(auto it : g[i])&lt;br /&gt;
                if(((1 &amp;lt;&amp;lt; it) &amp;amp; mask) == 0) {&lt;br /&gt;
                    dp[mask ^ (1 &amp;lt;&amp;lt; it)][it] = 1;&lt;br /&gt;
                    from[mask ^ (1 &amp;lt;&amp;lt; it)][it] = i;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int ans = INF, fr = -1;&lt;br /&gt;
    for(auto it : aux) {&lt;br /&gt;
        ans = max(ans, dp[(1 &amp;lt;&amp;lt; n) - 1][it]);&lt;br /&gt;
        if(dp[(1 &amp;lt;&amp;lt; n) - 1][it] == 1)&lt;br /&gt;
            fr = it;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(ans == INF)&lt;br /&gt;
        out &amp;lt;&amp;lt; &amp;quot;0&amp;quot;;&lt;br /&gt;
    else {&lt;br /&gt;
        out &amp;lt;&amp;lt; &amp;quot;1\n&amp;quot;;&lt;br /&gt;
        int node = fr, mask = (1 &amp;lt;&amp;lt; n) - 1;&lt;br /&gt;
        while(mask &amp;gt; 0) {&lt;br /&gt;
            out &amp;lt;&amp;lt; node + 1 &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
            int aux = mask ^ (1 &amp;lt;&amp;lt; node);&lt;br /&gt;
            node = from[mask][node];&lt;br /&gt;
            mask = aux;&lt;br /&gt;
        }&lt;br /&gt;
        out &amp;lt;&amp;lt; fr + 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tema = &lt;br /&gt;
Usor:&lt;br /&gt;
* https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=548 - realizati implementarea proprie&lt;br /&gt;
* https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=579 - Drum Hamiltonian  ( pe graf orientat )&lt;br /&gt;
* https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1942 - Cate cicluri Hamiltoniene&lt;br /&gt;
Mediu ( OJI, ONI ):&lt;br /&gt;
* https://www.infoarena.ro/problema/seg All You Can Code 2008 - ciclu-lant Hamiltonian&lt;br /&gt;
* https://www.infoarena.ro/problema/adn preONI 2005 Runda 1 - KMP, ciclu-lant Hamiltonian&lt;br /&gt;
* https://www.pbinfo.ro/probleme/2469/dungeon dungeon] ONI 2018, Constanța &amp;amp; Târgu Jiu - ciclu hamiltonian&lt;br /&gt;
Greu (Inter)&lt;br /&gt;
* https://www.infoarena.ro/problema/santa&lt;br /&gt;
&lt;br /&gt;
Articole&lt;br /&gt;
* https://www.infoarena.ro/ciclu-hamiltonian-in-graf-dens&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
</feed>