Ðîññèéñêî-Àðìÿíñêèé (Ñëàâÿíñêèé) ãîñóäàðñòâåííûé Óíèâåðñèòåò

Ôàêóëüòåò ïðèêëàäíîé ìàòåìàòèêè è èíôîðìàòèêè

 

Êóðñîâàÿ ðàáîòà

Òåìà:Íàõîæäåíèå  ýéëåðîâà öèêëà â ãðàôå.

Êàôåäðà:Ñèñòåìíîå ïðîãðàììèðîâàíèå.

Èñïîëíèòåëü: ñòóäåíòêà III êóðñà Ãåâîðãÿí Ê.Ã.

Ðóêîâîäèòåëü:  Åãèàçàðÿí Â.Ñ.

Åðåâàí 2003ã.

 

 

 

 

Ñîäåðæàíèå.

Îñíîâíûå ïîíÿòèÿ………………………………………………………3

Ïîèñê â øèðèíó…………………………………………………………5

Ïîèñê â ãëóáèíó…………………………………………………………8

Ýéëåðîâ öèêë……………………………………………………………11

Ëèòåðàòóðà................................................................................................16

 

 

 

 

 

 

 

 

 

 

 

 

Îñíîâíèå ïîíÿòèÿ.

 

Îðèåíòèðîâàííûé ãðàô (directed graph)  îïðåäåëÿåòñÿ êàê ïàðà (V,E), ãäå  V-êîíå÷íîå ìíîæåñòâî , à  E-áèíàðíîå îòíîøåíèå íà V, ò.å.ïîäìíîæåñòâî ìíîæåñòâà  V´V. Îðèåíòèðîâàííûé ãðàô èíîãäà äëÿ êðàòêîñòè íàçûâàþò îðãðàôîì (digraph).Ìíîæåñòâî V íàçûâàþò ìíîæåñòâîì âåðøèí ãðàôà (vartex set);åãî ýëåìåíò íàçûâàþò âåðøèíîé ãðàôà(vartex)  .Ìíîæåñòâî E  íàçûâàÿò ìíîæåñòâîì ðåáåð (edge set) ãðàôà; åãî ýëåìåíòû íàçûâàþò ðåáðàìè .

 íåîðèåíòèðîâàííîì (underected) ãðàôå G=(V,E) ìíîæåñòâî ðåáåð E ñîñòîèò èç íåóïîðÿäî÷åííûõ (unordered) ïàð âåðøèí : ïàðàìè ÿâëÿþòñÿ ìíîæåñòâà {u,v}, ãäå u,vÎ V è u ¹v. Áóäåì îáîçíà÷òü íåîðèåíòèðîâàííîå ðåáðî êàê (u,v) âìåñòî {u,v}; ïðè ýòîì äëÿ íåîðèåíòèðîâàííîãî ãðàôà  (u,v) è (v,u) îáîçíà÷àþò îäíî è òî æå ðåáðî.

Ïðî ðåáðî (u,v) îðãðàôà ãîâîðÿò, ÷òî îíî âûõîäèò èç (incident from, leaves) âåðøèíû u è âõîäèò (incident to, enters) â âåðøèíó v. Ïðî ðåáðî (u,v) íåîðãðàôà ãîâîðÿò, ÷òî îíî èíöèäåíòíà âåðøèíàì (incident on vertics) u è v.

Åñëè â ãðàôå G èìååòñÿ ðåáðî (u,v), òî ãîâîðÿò, ÷òî âåðøèíà v ñìåæíà ñ âåðøèíîé u (is adjacent to u). Äëÿ îðèåíòèðîâàííûõ ãðàôîâ îòíîøåíèå ñìåæíîñòè ÿâëÿåòñÿ ñèììåòðè÷íûì, íî äëÿ îðèåíòèðîâàííûõ ãðàôîâ ýòî íå îáÿçàòåëüíî.

Ñòåïåíüþ (degree) âåðøèíû â íåîðèåíòèðîâàííîì ãðàôå íàçûâàåòñÿ ÷èñëî èíöèäåíòíûõ åé ðåáåð.Äëÿ îðèåíòèðîâàííîãî ãðàôà ðàçëè÷àþò èñõîäÿùóþ ñòåïåíü(out degree), îïðåäåëÿåìóþ êàê ÷èñëî âûõîäÿùèõ èç íåå ðåáåð , è âõîäÿùóþ ñòåïåíü(in-degree), îïðåäåëÿåìóþ êàê ÷èñëî âõîäÿùèõ â íåå ðåáåð. Ñóììà èñõîäÿùåé è âõîäÿùåé ñòåïåíåé íàçûâàþò ñòåïåíüþ âåðøèíû.

Ïóòü äëèíû k (path of length k) èç âåðøèíû u â âåðøèíó v îïðåäåëÿåòñÿ êàê ïîñëåäîâàòåëüíîñòü âåðøèí (), â êîòîðîé  =u, =v è (,)ÎE äëÿ âñåõ i=1,2,…,k.Òàêèì îáðàçîì, ïóòü äëèíû  k ñîñòîèò èç k ðåáåð.Ýòîò ïóòü ñîäåðæèò âåðøèíû  è ðåáðà (,),(,),…,(,). Âåðøèíó íàçûâàþò íà÷àëîì ïóòè , âåðøèíó - åãî êîíöîì; ãîâîðÿò, ÷òî ïóòü âåäåò èç  â . Åñëè äëÿ äàííûõ âåðøèí u è  ñóùåñòâóåò ïóòü ð èç u â , òî ãîâîðÿò, ÷òî âåðøèíà  äîñòèæèìà èç u ïî ïóòè ð .

Ïóòü íàçûâàåòñÿ ïðîñòûì, åñëè âñå âåðøèíû â íåì ðàçëè÷íû.

Öèêëîì â îðãðàôå íàçûâàåòñÿ ïóòü, â êîòîðîì íà÷àëüíàÿ âåðøèíà ñîâïàäàåò ñ êîíå÷íîé è êîòîðûé ñîäåðæèò õîòÿ æû îäíî ðåáðî. Öèêë íàçûâàåòñÿ ïðîñòûì , åñëè â íåì íåò îäèíàêîâûõ âåðøèí.

 íåîðèåíòèðîâàííîì ãðàôå ïóòü <> íàçûâàåòñÿ (ïðîñòûì) öèêëîì , åñëè k³3, = è âñå âåðøèíû  ðàçëè÷íû. Íåîðèåíòèðîâàííûé ãðàô íàçûâàåòñÿ ñâÿçíûì, åñëè äëÿ ëþáîé ïàðû âåðøèí ñóùåñòâóåò ïóòü èç îäíîé â äðóãóþ.Äëÿ íåîðèåíòèðîâàííîãî ãðàôà îòíîøåíèåáûòü äîñòèæèìûì èçÿâëÿåòñÿ îòíîøåíèåì ýêâèâàëåíòíîñòè íà ìíîæåñòâå âåðøèí. Êëàññû åêâèâàëâíòíîñòè íàçûâàþòñÿ ñâÿçíûìè êîìïîíåíòàìè ãðàôà. Íåîðèåíòèðîâàííûé ãðàô ñâÿçàí òîãäà è òîëüêî òîãäà, êîãäà îí ñîñòîèò èç åäèíñòâåííîé ñâÿçíîé êîìïîíåíòû.

Îðèåíòèðîâàííûé ãðàô íàçûâàåòñÿ ñèëüíî ñâÿçíûì , åñëè èç ëþáîé åãî âåðøèíû äîñòèæèìà ëþáàÿ äðóãàÿ. Ëþáîé îðèåíòèðîâàííûé ãðàô ìîæíî ðàçáèòü íà ñèëüíî ñâÿçíûå êîìïîíåíòû, êîòîðûå îïðåäåëÿþòñÿ êàê êëàññû ýêâèâàëâíòíîñòè îòíîøåíèÿu äîñòèæèìî èç v è v äîñòèæèìî èç u”.Îðèåíòèðîâàííûé ãðàô ñèëüíî ñâÿçàí òîãäà è òîëüêî òîãäà, êîãäà ñîñòîèò èç åäèíñòâåííîé ñèëüíî ñâÿçíîé êîìïîíåíòû.

Ãðàô  =(,) íàçûâàþò ïîäãðàôîì ãðàôà G=(V,E), åñëè ÍE , ÍV.

Âûáîð ñîîòâåòñòâóþùåé ñòðóêòóðû äàííûõ äëÿ ïðåäñòàâëåíèÿ ãðàôà â ïàìÿòè êîìïüþòåðà èìååò ïðèíöèïèàëüíîå çíà÷åíèå ïðè ðàçðàáîòêå ýôôåêòèâíûõ àëãîðèòìîâ.

Ïðè ðåøåíèè çàäà÷ èñïîëüçóåòñÿ ñëåäóþùèå ÷åòûðå ñïîñîáà îïèñàíèÿ ãðàôà: ìàòðèöà ñìåæíîñòè; ìàòðèöà èíöèäåíòíèñòè; ñïèñêè ñâçè è ïåðå÷åíü ðåáåð.

Ìàòðèöà ñìåæíîñòèýòî äâóìåðíûé ìàññèâ ðàçìåðíîñòè (êîëè÷åñòâî_âåðøèí)´(êîëè÷åñòâî_âåðøèí)

A[i,j]= 1, åñëè âåðøèíà ñ íîìåðîì i ñìåæàí ñ âåðøèíîé ñ íîìåðîì j;

  A[i,j]=0, â ïðîòèâíîì ñëó÷àå.

Íàïðèìåð:

ìàòðèöà ñìåæíîñòè äëÿ äàííîãî ãðàôà

 

a

b

c

d

a

0

1

1

0

  b

1

0

1

0

c

1

1

0

1

d

0

0

1

0

                              a .                . b

                              c  .     . d

 

 

 

Ïîèñê â øèðèíó.

 

Ïîèñê  â øèðèíó (breadth-first search) –îäèí èç áàçèñíûõ àëãîðèòìîâ, ñîñòàâëÿþùèé îñíîâó ìíîãèõ äðóãèõ. Íàïðèìåð, àëãîðèòì Äåéêñòðû ïîèñêà êðàò÷àéøèõ ïóòåé èç îäíîé âåðøèíû è àëãîðèòì Ïðèìà ïîèñêà ìèíèìàëüíîãî ïîêðûâàþùåãî äåðåâà ìîãóò ðàññìàòðèâàòüñÿ êàê îáîáùåíèå ïîèñêà â øèðèíó.

Ïóñòü ôèêñèðîâàíà íà÷àëüíàÿ âåðøèíà s . Àëãîðèòì ïîèñêà â øèðèíó ïåðå÷èñëÿåò âñå äîñòèæèìûå èç s (åñëè èäåò ïî ðåáðàì) âåðøèíû â ïîðÿäêå âîçðàñòàíèÿ ðàññòîÿíèÿ îò s. Ðàññòîÿíèåì ñ÷èòàåòñÿ äëèíà (÷èñëî ðåáåð) êðàò÷àéøåãî ïóòè.  ïðîöåññå ïîèñêà èç ãðàôà âûäåëÿåòñÿ  ÷àñòü, íàçûâàåìàÿäåðåâîì ïîèñêà â øèðèíóñ êîðíåì s.Îíà ñîäåðæèò âñå äîñòèæèìûå èç s âåðøèíû. Äëÿ êàæäîé èç íèõ ïóòü èç êîðíÿ â äåðåâå ïîèñêà áóäåò îäíèì èç êðàò÷àéøèõ ïóòåé (èç íà÷àëüíîé âåðøèíû) â ãðàôå. Àëãîðèòì ïðèìåíèì è ê îðèåíòèðîâàííûì è ê íåîðèåíòèðîâàííûì ãðàôàì.

Íàçâàíèå îáúÿñíÿåòñÿ òåì, ÷òî â ïðîöåññå ïîèñêà ìû èäåì âøèðü, à íå âãëóáü (ñíà÷àëà ïðîñìàòðèâàåì âñå ñîñåäíèå âåðøèíû, çàòåì ñîñåäåé ñîñåäåé è ò.ä.).

Äëÿ íàãëÿäíîñòè áóäåì ñ÷èòàòü, ÷òî â ïðîöåññå ðàáîòû àëãîðèòìà âåðøèíû ãðàôà ìîãóò áûòü áåëûìè, ñåðûìè è ÷åðíûìè. Á íà÷àëå îíè âñå áåëûå, íî â õîäå ðàáîòû àëãîðèòìà áåëàÿ âåðøèíà ìîæåò ñòàòü ñåðîé, à ñåðàÿ÷åðíîé (íî íå íàîáîðîò). Ïîâñòðå÷àâ íîâóþ âåðøèíó, àëãîðèòì ïîèñêà êðàñèò åå, òàê ÷òî îêðàøåííûå âåðøèíû(ñåðûå èëè ÷åðíûå) – ýòî â òî÷íîñòè òå, êîòîðûå óæå îáíàðóæåíû. Ðàçëè÷èå ìåæäó ñåðûìè è ÷åðíûìè âåðøèíàìè èñïîëüçóåòñÿ àëãîðèòìîì äëÿ óïðàâëåíèÿ ïîðÿäêîì îáõîäà : ñåðûå âåðøèíû îáðàçóþòëèíèþ ôðîíòà”, à ÷åðíûå – “òûë”. Áîëåå òî÷íî, ïîääåðæèâàåòñÿ òàêîå ñâîéñòâî: åñëè (u,v) Î E è u ÷åðíàÿ, òî v- ñåðàÿ èëè ÷åðíàÿ âåðøèíà. Òàêèì îáðàçîì, òîëüêî ñåðóå âåðøèíû ìîãóò èìåòü ñìåæíûå íåîáíàðóæåííûå âåðøèíû.

Âíà÷àëå äåðåâî ïîèñêà ñîñòîèò òîëüêî èç êîðíÿ- íà÷àëüíîé âåðøèíû s. Êàê òîëüêî àëãîðèòì îáíàðóæèâàåò íîâóþ âåðøèíó v, ñìåæíóþ ñ ðàíåå íàéäåííîé âåðøèíîé u, âåøèíà v (âìåñòå ñ ðåáðîì (u,v)) äîáàâëÿåòñÿ ê äåðåâó ïîèñêà, ñòàíîâÿñü ðåáåíêîì âåðøèíû u, à u ñòàíîâèòñÿ ðîäèòåëåì v. Êàæäàÿ âåðøèíà îáíàðóæèâàåòñÿ òîëüêî îäèí ðàç, òàê ÷òî äâóõ ðîäèòåëåé ó íåå áûòü íå ìîæåò. Ïîíÿòèÿ ïðåäêà è ïîòîìêà  îïðåäåëÿþòñÿ êàê îáû÷íî (ïîòîìêè-ýòî äåòè, äåòè äåòåé, è ò.ä.). Äâèãàÿñü îò âåðøèíû ê êîðíþ, ìû ïðîõîäèì âñåõ åå ïðåäêîâ.

Ïðèâåäåííàÿ íèæå ïðîöåäóðà  èñïîëüçóåò ïðåäñòàâëåíèå ãðàôà ìàòðèöåé ñìåæíûõ âåðøèí. Äëÿ êàæäîé âåðøèíû u ãðàôà äîïîëíèòåëüíî õðàíèòñÿ åå öÿåò color[u]  è åå ïðåäøåñòâåííèê pr[u].  Êðîìå òîãî , ðàññòîÿíèå îò s äî u çàïèñûâàåòñÿ  â ïîëå d[u]. Ïðîöåäóðà èñïîëüçóåò òàêæå îÿåðåäü Q (FIFO) äëÿ õðàíåíèÿ ìíîæåñòâà ñåðûõ âåðøèí.

#include "iostream.h"

#include "fstream.h"

void  Del(int *,int);

int main()

{

    int m;//íîìåð îáðàáàòûâàåìîé âåðøèíû

    int N;//êîëè÷åñòâî âåðøèí

    int ** mat;//ìàòðèöà ñìåæíîñòè

    ifstream fin("input.txt");

    ofstream fout ("output.txt");

    fin>>N;

    mat=new int *[N];

    for(int i=0;i<N;i++)

            mat[i]=new int [N];

    for(int j=0;j<N;j++)

            for(int o=0;o<N;o++)

                    fin>>mat[j][o];//ïðî÷ëè èç ôàéëà

            int *color;//öâåò 0-áåëûé, 1-ñåðûé,2-÷åðíûé

            int * d;//ðàññòîÿíèå

            int * pr;//ïðåäøåñòâåííèê

            int *Q;//î÷åðåäü äëÿ ñìåæíûõ âåðøèí

            color=new int [N];

            d=new int [N];

            pr=new int [N];

            Q=new int [N];

    for(int s=0;s<N;s++)

    {  color[s]=0;

            d[s]= 0;

            pr[s]=0;

    }

    Q[0]=0;

    int count=1;// ñ÷åò÷èê äëÿ Q

    fout<<"Ocherednost passmatrivanija vershin:"<<'\n';

  while(count!=0)

    {

            m=Q[0];

            fout<<m<<" -Nomer vershini"<<'\n';

            for(int k=1;k<N;k++)

            {

                    if(mat[m][k]==1)// åñëè k ñìåæíà ñ m

                    {if(color[k]==0)

                    {  color[k]=1;

                           d[k]=d[m]+1;

                           pr[k]=m;

                           Q[count]=k;

                           count++;}}

            }

 

     Del(Q,count);

     count--;

     color[m]=2;

    }

    for(int h=0;h<N;h++)

    {fout<< "Ver_Num "<<h<<"  Wes "<<d[h]<<'\n';}

 

    delete [] color;

    delete [] d;

    delete [] pr;

    delete [] Q;

    for(int f=0;f<N;f++)

    delete [] mat[f];

    delete mat;         

            return 0;

}

void  Del(int *A, int a)

 {

     for(int k=0;k<a;k++) 

             A[k]=A[k+1];

     A[a-1]=-1;

     return;

 }

Ïðèìåð:

input.txt

5

0 1 0 0 1

1 0 1 0 1

0 1 0 1 1

0 0 1 0 1

1 1 1 1 0

 

 
 

 

 

 

 

 

 


output.txt

Text Box: Ocherednost passmatrivanija vershin:
0 -Nomer vershini
1 -Nomer vershini
4 -Nomer vershini
2 -Nomer vershini
3 -Nomer vershini
Ver_Num 0  Wes 0
Ver_Num 1  Wes 1
Ver_Num 2  Wes 2
Ver_Num 3  Wes 2
Ver_Num 4  Wes 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ïîèñê â ãëóáèíó.

Ñòðàòåãèÿ ïîèñêà â ãëóáèíó òàêîâà: èäòèâãëóáü”, ïîêà ýòî âîçìîæíî (åñòü íåïðîéäåííûå èñõîäÿùèå ðåáðà), è âîçâðàùàòüñÿ è èñêàòü äðóãîé ïóòü, êîãäà òàêîõ ðåáåð íåò. Òàê äåëàåòñÿ ïîêà íå îáíàðóæåíû âñå âåðøèíû , äîñòèæèìûå èç èñõîäíîé. (Åñëè ïîñëå ýòîãî îñòàþòñÿ íåîáíàðóæåííûå âåðøèíû , ìîæíî âûáðàòü îäíó èç íèõ è ïîâòîðèòü ýòîò ïðîöåññ, è äåëàòü òàê äî òåõ ïîð, ïîêà ìû íå îáíàðóæèì âñå âåðøèíû ãðàôà.)

Êàê è ïðè ïîèñêå â øèðèíó, îáíàðóæèâ  (âïåðâûå) âåðøèíó v, ñìåæíóþ ñ u, ìû îòìå÷àåì ýòî ñîáûòèå, ïîìåùàÿ â ïîëå pr[u] çíà÷åíèå u.Ïîëó÷àåòñÿ äåðåâî èëè íåñêîëüêî äåðåâüåâ, åñëè ïîèñê ïîâòîðÿåòñÿ  èç íåñêîëüêèõ âåðøèí. Ãîâîðÿ äàëüøå î ïîèñêå â ãëóáèíó, âñåãäà áóäåì ïðåäïîëàãàòü , ÷òî òàê è äåëàåòñÿ (ïîèñê ïîâòîðÿåòñÿ). Ïîëó÷àåì ïîäãðàô ïðåäøåñòâîâàíèÿ, îïðåäåëåííûé òàê: , ãäå       

Ïîäãðàô ïðåäøåñòâîâàìèÿ ïðåäñòàâëÿåò ñîáîé ëåñ ïîèñêà â ãëóáèíó, ñîñòîÿùèé èç äåðåâüåâ ïîèñêà â ãëóáèíó.

Àëãîðèòì ïîèñêà â ãëóáèíó òàêæå èñïîëüçóåò öâåòà âåðøèí. Êàæäàÿ èç âåðøèí âíà÷àëå áåëàÿ. Áóäó÷è îáíàðóæåííîé, îíà ñòàíîâèñÿ ñåðîé;îíà ñòàíåò ÷åðíîé , êîãäà áóäåò ïîëíîñòüþ  îáðàáîòàíà, ò.å. êîãäà ñïèñîê ñìåæíûõ ñ íåé âåðøèí áóäåò ïðîñìîòðåí. Êàæäàÿ âåðøèíà ïîïàäàåò ðîâíî â îäíî äåðåâîïîèñêà â ãëóáèíó, òàê ÷òî ýòè äåðåâüÿ íå ïåðåñåêàþòñÿ.

 Ïîìèìî ýòîãî, ïîèñê â ãëóáèíó ñòàâèò íà âåðøèíàõ ìåòêè âðåìåíè. Êàæäàÿ âåðøèíà èìååò äâå ìåòêè: â d[u] çàïèñàíî, êîãäà ýòà âåðøèíà áûëà îáíàðóæåíà (è ñäåëàíà ñåðîé), à â f[u] – êîãäà áûëà çàêîí÷åíà îáðàáîòêà ñïèñêà ñìåæíûõ âåðøèí (è v ñòàë ÷åðíîé).

Ýòè ìåòêè âðåìâíè èñïîëüçóþòñÿ âî ìíîãèõ àëãîòèìàõ íà ãðàôàõ è ïîëåçíû äëÿ àíàëèçà ñâîéñòâ ïîèñêà â ãëóáèíó.

 ïðèâîäèìîé äàëåå ïðîöåäóðå DFS( Depth-First Search- ïîèñêà â ãëóáèíó) ìåòêè âðåìåíè d[u] è f[u] ÿâëÿþòñÿ öåëûìè ÷èñëàìè îò 1 äî 2|V| ; äëÿ ëþáîé âåðøèíû âûïîëíåíî íåðàâåíñòâî     d[u]< f[u].

Âåðøèíà u áóäåò áåëîé äî ìîìåíòà d[u], ñåðîé ìåæäó d[u] è f[u] è ÷åðíîé ïîñëå f[u].

Èñõîäíûé ãðàô ìîæåò áûòü îðèåíòèðîâàííûì èëè íåîðèåíòèðîâàííûì. Ïåðåìåííàÿ  timeãëîáàëüíàÿ ïåðåìåííàÿ òåêóùåãî âðåìåíè, èñïîëüçóåìîãî äëÿ ïîìåòîê.

 

#include "iostream.h"

#include "fstream.h"

void DFS_Visit(int ** ,int *,int*,int*,int*,int);//ìàòð,öâåò,íà÷àëîîáíàð,êîíåöîáðàáîòêè,âåðøèíà

int time;

int N;//êîëè÷åñòâî âåðøèí

int main()

{

    time=0;

    ifstream fin ("input.txt");

    ofstream fout("output.txt");

    fin>>N;

    int ** mat;//ìàòðèöà ñìåæíîñòè

    mat=new int *[N];

    for(int i=0;i<N;i++)

            mat[i]=new int [N];

    for(int j=0;j<N;j++)

            for(int o=0;o<N;o++)

                    fin>>mat[j][o];//ïðî÷ëè èç ôàéëà

    int *color;//öâåò 0-áåëûé, 1-ñåðûé,2-÷åðíûé

    int * d;//âðåìÿ îáíàðóæåíèÿ

    int * pr;//ïðåäøåñòâåííèê

    int * f;//âðåìÿ îêîí÷àíèÿ îáðàáîòêè

    color=new int [N];

    d=new int [N];

    pr=new int [N];

    f=new int [N];

    for(int s=0;s<N;s++)

    {  color[s]=0;

            pr[s]=-1;

    }

    for(int k=0;k<N;k++)

            if(color[k]==0)

            DFS_Visit(mat,color,d,f,pr,k);

    for(int r=0;r<N;r++)

            fout<<"Num_Versh- "<<r<<"  Predshestvennik- "<<pr[r]<<"  "<<d[r]<<"-nachalo; konec- "<<f[r]<<'\n';

    delete [] d;

    delete [] pr;

    delete [] f;

    delete [] color;

    for(int u=0;u<N;u++)

    delete [] mat[u];

     delete mat;

    return 0;

}

void DFS_Visit(int ** A,int * col,int * D,int *F,int * Pr,int u)

{

    col[u]=1;

    time=time+1;

    D[u]=time;

    for(int p=0;p<N;p++)

    {

            if(A[u][p]==1)

            {

                    if(col[p]==0)

                    {

                           Pr[p]=u;

                           DFS_Visit(A,col,D,F,Pr,p);

                    }

            }

    }

    col[u]=2;

    time=time+1;

    F[u]=time;

}

Ïðèìåð:

        6

0 1 0 1 0 0

0 0 0 0 1 0

0 0 0 0 1 1

0 1 0 0 0 0

0 0 0 1 0 0

0 0 0 0 0 1

 
input.txt

 

 

 

 

 

 

 

Output.txt

 

                Num_Versh- 0  Predshestvennik- -1  1-nachalo; konec- 8

                Num_Versh- 1  Predshestvennik- 0  2-nachalo; konec- 7

Num_Versh- 2  Predshestvennik- -1  9-nachalo; konec- 12

                Num_Versh- 3  Predshestvennik- 4  4-nachalo; konec- 5

                Num_Versh- 4  Predshestvennik- 1  3-nachalo; konec- 6

Num_Versh- 5  Predshestvennik- 2  10-nachalo; konec- 11

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Ýéëåðîâ öèêë.

 

Òðåáóåòñÿ íàéòè öèêë, ïðîõîäÿùèé ïî êàæäîé äóãå ðîâíî îäèí ðàç. Ýòó çàäà÷ó âïåðâûå ïîñòàâèë è ðåøèë Ëåîíàðä Ýéëåð, ÷åì è çà­ëîæèë îñíîâû òåîðèè ãðàôîâ, à ñîîòâåòñòâóþùèå öèêëû òåïåðü íàçûâà­þòñÿ ýéëåðîâûìè. Ôèãóðû, êîòîðûå òðåáóåòñÿ îáðèñîâàòü, íå ïðå­ðûâàÿ è íå ïîâòîðÿÿ ëèíèè, òàêæå îòíîñÿòñÿ ê ýéëåðîâûì öèêëàì.

Çàäà÷à âîçíèêëà èç ïðåäëîæåííîé Ýéëåðó ãîëîâîëîìêè, ïîëó÷èâøåé íàçâàíèå "ïðîáëåìà êåíèãñáåðãñêèõ ìîñòîâ". Ðåêà Ïðåãåëü, ïðîòåêàþùàÿ ÷åðåç Êàëèíèíãðàä (ïðåæäå  ãîðîä  íàçûâàëñÿ Êåíèãñáåðãîì), îìûâàåò äâà îñòðîâà. Áåðåãà ðåêè ñâÿçàíû ñ îñòðîâàìè òàê,


 êàê ýòî ïîêàçàíî íà  ðèñóíêå.

 ãîëîâîëîìêå òðåáîâàëîñü íàéòè ìàð­øðóò, ïðîõîäÿùèé ïî âñåì ó÷àñòêàì ñóøè òàêèì îáðàçîì, ÷òîáû êàæäûé  èç ìîñòîâ áûë ïðîéäåí ðîâíî îäèí ðàç, à íà÷àëüíûé è êîíå÷íûé ïóíêòû ìàðøðóòà ñîâïàäàëè.

Äà­äèì òåïåðü ñòðîãîå îïðåäåëåíèå ýéëåðîâó öèêëó è ýéëåðîâó ãðàôó. Åñëè ãðàô èìååò öèêë (íå îáÿçàòåëüíî ïðîñòîé), ñîäåðæàùèé âñå ðåáðà ãðàôà ïî îäíîìó ðàçó, òî òàêîé öèêë íàçûâàåòñÿ ýéëåðîâûì öèêëîì, à ãðàô íàçûâàåòñÿ ýéëåðîâûì ãðàôîì.

ßñíî, ÷òî ýéëåðîâ öèêë ñîäåðæèò íå òîëüêî âñå ðåáðà ïî îäíîìó ðàçó, íî è âñå âåðøèíû ãðàôà (âîçìîæíî, ïî íåñêîëüêî ðàç). Î÷å­âèäíî òàêæå, ÷òî ýéëåðîâûì ìîæåò áûòü òîëüêî ñâÿçíûé ãðàô.

Âûáåðåì â êà÷åñòâå âåðøèí ãðàôà áåðåãà ðåêè, à â êà÷åñòâå  ðåáåð - ìîñòû, èõ ñîåäèíÿþùèå. Ïîñëå ýòîãî çàäà÷à ñòàíîâèòñÿ î÷å­âèäíîé: òðåáîâàíèå íåîñóùåñòâèìî - ÷òîáû åãî âûïîëíèòü, ÷èñëî äóã, ïðèõîäÿùèõ ê êàæäîé âåðøèíå, äîëæíî áûòü ÷åòíûì.  ñàìîì äåëå, ïî­ñêîëüêó ïî îäíîìó ìîñòó íåëüçÿ ïðîõîäèòü äâàæäû, êàæäîìó âõîäó íà áåðåã äîëæåí ñîîòâåòñòâîâàòü âûõîä.

 Êðèòåðèé ñóùåñòâîâàíèÿ ýéëåðîâà öèêëà:

×òî íåîáõîäèìî, ÷òîáû â ãðàôå ñóùåñòâîâàë ýéëåðîâ öèêë? Âî-ïåðâûõ, ãðàô äîëæåí áûòü ñâÿçàííûì: äëÿ ëþáûõ äâóõ âåðøèí äîëæåí ñóùåñòâîâàòü ïóòü, èõ ñîåäèíÿþùèé. Âî-âòîðûõ, äëÿ íåîðèåíòèðîâàí­íûõ ãðàôîâ ÷èñëî ðåáåð â êàæäîé âåðøèíå äîëæíî áûòü ÷åòíûì. Íà ñà­ìîì äåëå ýòîãî îêàçûâàåòñÿ äîñòàòî÷íî.

Òåîðåìà . ×òîáû â ñâÿçàííîì íåîðèåíòèðîâàííîì ãðàôå G ñóùåñòâîâàë ýéëåðîâ öèêë, íåîáõîäèìî è äîñòàòî÷íî, ÷òîáû ÷èñëî âåðøèí  íå÷åòíîé ñòåïåíè ðàâíÿëàñü íóëþ.

Äîêàçàòåëüñòâî.

Íåîáõîäèìîñòü. Ëþáîé ýéëåðîâ öèêë äîëæåí ïðèéòè â âåðøèíó ïî îäíîìó ðåáðó è ïîêèíóòü åå ïî äðóãîìó, òàê êàê ëþáîå ðåáðî äîëæíî èñïîëüçîâàòüñÿ ðîâíî îäèí ðàç. Ïîýòîìó, åñëè G ñîäåðæèò ýéëåðîâ öèêë, òî ñòåïåíè âåðøèí äîëæíû áûòü ÷åòíûìè.

Äîñòàòî÷íîñòü. Ïóñòü Gñâÿçíûé íåîðèåíòèðîâàííûé ãðàô, âñå âåðøèíû êîòîðîãî èìåþò ÷åòíóþ ñòåïåíü. Íà÷íåì ïóòü èç íåêîòîðîé ïðîèçâîëüíîé âåðøèíû x0 è ïîéäåì ïî íåêîòîðîìó ðàíåå íå èñïîëüçîâàííîìó ðåáðó ê ñëåäóþùåé âåðøèíå, è òàê äî òåõ ïîð, ïîêà íå âåðíåìñÿ â âåðøèíó x0 è íå çàìêíåì öèêë. Åñëè âñå ðåáðà îêàæóòñÿ èñïîëüçîâàííûìè, òî íóæíûé ýéëåðîâ öèêë ïîñòðîåí. Åñëè æå íåêîòîðûå ðåáðà íå èñïîëüçîâàíû, òî ïóñòü Ôòîëüêî ÷òî ïîñòðîåííûé öèêë. Òàê êàê ãðàô G ñâÿçåí, òî öèêë Ô äîëæåí ïðîõîäèòü ÷åðåç íåêîòîðóþ âåðøèíó, ñêàæåì xi, ÿâëÿþùóþñÿ êîíå÷íîé âåðøèíîé êàêîãî-ëèáî äî ñèõ ïîð íå èñïîëüçîâàííîãî ðåáðà. Åñëè óäàëèòü âñå ðåáðà, ïðèíàäëåæàùèå Ô, òî â îñòàâøåìñÿ ãðàôå âñå âåðøèíû ïî-ïðåæíåìó áóäóò èìåòü ÷åòíóþ ñòåïåíü, òàê êàê â öèêëå Ô äîëæíî áûòü ÷åòíîå ÷èñëî ðåáåð (0 ÿâëÿåòñÿ ÷åòíûì ÷èñëîì), èíöèäåíòíûõ êàæäîé âåðøèíå.

Íà÷èíàÿ òåïåðü ñ xi, ïîëó÷àåì öèêë Ô’, íà÷èíàþùèéñÿ è îêàí÷èâàþùèéñÿ â xi. Åñëè âñå îñòàâøèåñÿ ðàíåå ðåáðà èñïîëüçîâàíû äëÿ öèêëà Ô’, òî ïðîöåññ îêîí÷åí. Íóæíûé ýéëåðîâ öèêë áóäåò îáðàçîâàí ÷àñòüþ öèêëà Ô îò âåðøèíû x0 äî xi, çàòåì öèêëîì Ôè, íàêîíåö, ÷àñòüþ öèêëà Ô îò âåðøèíû xi äî x0. Åñëè æå âñå åùå îñòàëèñü íåèñïîëüçîâàííûå ðåáðà, òî îáúåäèíåíèå ïîñòðîåííûõ âûøå öèêëîâ Ô è Ôäàåò íîâûé öèêë Ô. Ìû ñíîâà ìîæåì íàéòè âåðøèíó xj, ïðèíàäëåæàùóþ öèêëó è ÿâëÿþùóþñÿ êîíöåâîé âåðøèíîé íåêîòîðîãî íåèñïîëüçîâàííîãî ðåáðà. Çàòåì ìû ìîæåì ïðèñòóïèòü ê ïîñòðîåíèþ íîâîãî öèêëà Ô’, íà÷èíàâøåãîñÿ â xj, è òàê äî òåõ ïîð, ïîêà íå áóäóò èñïîëüçîâàíû âñå ðåáðà è íå áóäåò ïîëó÷åí òàêèì îáðàçîì ýéëåðîâ öèêë Ô. Ýòî äîêàçûâàåò òåîðåìó.Õîòÿ äîêàçàòåëüñòâî ïðîâåäåíî äëÿ íåîðèåíòèðîâàííûõ ãðàôîâ, îíî ñðàçó ïåðåíîñèòñÿ íà îðèåíòèðîâàííûå, òîëüêî òðåáîâàíèå ÷åòíî­ñòè çàìåíÿåòñÿ òåïåðü íà òàêîå: ÷èñëî âõîäÿùèõ â êàæäóþ âåðøèíó ðåáåð äîëæíî áûòü ðàâíî ÷èñëó âûõîäÿùèõ.

Àëãîðèòì ïîñòðîåíèÿ ýéëåðîâà öèêëà çàêëþ÷àåòñÿ â ñëåäóþùåì. Íà÷èíàÿ ñ ïðîèçâîëüíîé âåðøèíû (äëÿ êîíêðåòíîñòè, ñ ïåðâîé âåðøèíû), ñòðîèì ïóòü, ûäàëÿÿ ðåáðà è çàïîìèíàÿ âåðøèíû â ñòåêå, äî òåõ ïîð, ïîêà ìíîæåñòâî ñìåæíîñòè î÷åðåäíîé âåðøèíû íå îêàæåòñÿ ïóñòûì, ÷òî îçíà÷àåò, ÷òî ïóòü óäëèíèòü íåëüçÿ. Ïðè ýòîì  ñ íåîáõîäèìîñòüþ ïðèäåì â òó âåðøèíó, ñ êîòîðîé íà÷àëè.  ïðîòèâíîì ñëó÷àå ýòî îçíà÷àëî áû, ÷òî âåðøèíà èìååò íå÷åòíóþ ñòåïåíü, ÷òî íå âîçìîæíî ïî óñëîâèþ. Òàêèì îáðàçîì, èç ãðàôà áûëè óäàëåíû ðåáðà öèêëà, à âåðøèíû öèêëà áûëè ñîõðàíåíû â ñòåêå. Ïðè ýòîì ñòåïåíè âñåõ âåðøèí  îñòàëèñü ÷åòíûìè. Äàëåå ýòà âåðøèíà âûâîäèòñÿ â êà÷åñòâå ïåðâîé âåðøèíû ýéëåðîâà öèêëà, à ïðîöåññ ïðîäîëæàåòñÿ , íà÷èíàÿ ñ âåðøèíû, ñòîÿùåé íà âåðøèíå ñòåêà.

Header File

#include "iostream.h"

# include "stdlib.h"

struct node

{       int info;

      node * link;

};

class Stack

{

private:

      node * first;

public:

      Stack();

      ~Stack();

      bool Empty();

      void Pop(int&);

      void Push(int);

};

Stack ::Stack()

{first= NULL;}

Stack::~Stack()

{node *p=first, *q;

      while(p)

      {       q=p;

              p=p->link;

              delete q;

      }

}

bool Stack::Empty()

{     if(first==NULL)

              return true;

      else

              return false;

}

void Stack::Pop(int &k)

{     if(Empty()==true)

      {       cout<<"ErrorP"<<endl;

              exit(1);

      }

      else

      {       node * p=first;

              k=first->info;

              first=first->link;

      delete p;

      return;

      }

}

void Stack::Push(int k)

{node * q;

      q=new node;

      if(q)

      {   q->info=k;

              q->link=first;

              first=q;

              return;

      }

      else

      {       cout<<"Erroe";

              exit(1);

      }

}

Source File

#include "iostream.h"

#include "fstream.h"

# include "stk.h"

int main()

{

      Stack S;

      int d;//äëÿ ïîäñ÷åòà ñòåðåíåé âåðøèí

      int m;//òåêóùàÿ âåðøèíà

      int sum;// äëÿ ïîäñ÷åòà ñìåæíûõ âåðøèí

      int N;//êîëè÷åñòâî âåðøèí

      int ** mat;//ìàòðèöà ñìåæíîñòè

      ifstream fin("input.txt");

      ofstream fout ("output.txt");

      fin>>N;

      mat=new int *[N];

      for(int i=0;i<N;i++)

              mat[i]=new int [N];

      for(int j=0;j<N;j++)

              for(int o=0;o<N;o++)

                     fin>>mat[j][o];

              for(int g=0;g<N;g++)// ïðîâåðÿåìá åñòü ëè ýéëåðîâ öèêë

              {d=0;

                     for(int h=0;h<N;h++)

                             d=d+mat[g][h];

                     if(d%2!=0)

              {fout<<"Eulerov cikla net"<<'\n';

                      return 0;}

              }

              S.Push(0); // åñòü öèêë, íàéäåì åãî

              while(!S.Empty())

              {       sum=0;

                     S.Pop(m);

                     S.Push(m);

                     for(int t=0;t<N;t++)

                             sum=sum +mat[m][t];

                     if(sum==0)

                             {       S.Pop(m);

                                     fout<<m<<" ";

                             }

                     else

                     {              for(int r=0;r<N;r++)

                                     if(mat[m][r]==1)

                                     {       S.Push(r);

                                             mat[m][r]=0;

                                             mat[r][m]=0;

                                             break;

                                     }

                     }

              }      

for(int u=0;u<N;u++)

                    delete [] mat[u];

                    delete mat; 

 

              return 0;

}

 

Ïðèìåð:

input.txt

 

 

0

6

1

4

3

2

1

0

 

           7

0 1 0 0 0 0 1

1 0 1 0 1 0 1

0 1 0 1 0 0 0

0 0 1 0 1 0 0

0 1 0 1 0 1 1

0 0 0 0 1 0 1

1 1 0 0 1 1 0

 
                                        

 

 

 

 

                                                          Ïîñëå 7-îãî øàãà ñòåê:             , ïîòîì 0 âûâîäèòñÿ.

 

 

 

 

6

5

4

6

1

4

3

2

1

0

 
 


output.txt                                                              

 

0 6 5 4 6 1 4 3 2 1 0

 
 


                                                  Ïîñëå 10-îãî øàãà ñòåê:             , è âñå îñòàëüíûå

                                                           ïîî÷åðåäíî  âûâîäÿòñÿ.

 

 

 

 

 

 

 

 

 

 

 

 


Ëèòåðàòóðà.

 

1.     Êîðìåí, ËåéçåðñîíÀëãîðèòìû, ïîñòðîåíèå è àíàëèç”.

2.      Ñ.Îêóëîâ  Ïðîãðàììèðîâàíèå â àëãîðèòìàõ”.

3.     www.codenet.ru

4.     www.algolist.ru