Exemplo n.º 1
0
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (граф.количество_вершин == 0)
            {
                return;
            }

            Холст dr = new Холст(граф.количество_вершин, this.Width, this.Height - 70, e.Graphics, new Pen(Color.Black), new SolidBrush(this.BackColor), this.Font);

            double a = 0;

            for (int j = 0; j < граф.количество_вершин; j++)
            {
                for (int k = 0; k < граф.количество_вершин; k++)
                {
                    if (граф.ЕстьРебро(j, k))
                    {
                        dr.соединить_вершины(j, k);
                    }
                }
                a += dr.step;
            }
            if (dialog1.dA != -1 && dialog1.dB != -1 && dialog1.dC != -1)
            {
                dr.p.Width = 4;
                if (граф.поиск_в_глубину(dr, dialog1.dA, dialog1.dB, dialog1.dC, dialog1.dD))
                {
                    this.statusStrip1.Items[0].Text = "Цикл найден.";
                }
                else
                {
                    this.statusStrip1.Items[0].Text = "Нет таких циклов.";
                }
                dr.p.Width = 1;
            }
            for (int j = 0; j < граф.количество_вершин; j++)
            {
                dr.вершина(j);
            }
        }
Exemplo n.º 2
0
        public bool поиск_в_глубину(Холст холст,int a, int b, int c, int d)
        {
            int максимальная_длина=0;
                for(int i=0;i<100;i++)
                        пройдено[i]=-1;
                int[] очередь = new int[100];
                пройдено[a]=-2;
                int текущая_вершина=a;
                очередь[0]=a;
                int текущая_длина=1;
                int следующая_вершина=0;
                int[] цикл = new int[1];
                bool ребро_пройдено=false;
                do
                {
                        if(следующая_вершина<количество_вершин)
                        for(;следующая_вершина<количество_вершин;следующая_вершина++)
                        if(ЕстьРебро(текущая_вершина,следующая_вершина)) break;
                        if(следующая_вершина<количество_вершин)
                        {
                                if(пройдено[следующая_вершина]==-1)
                                {
                                        // шаг вперед
                                        очередь[текущая_длина++]=текущая_вершина;
                                        пройдено[следующая_вершина]=текущая_вершина;
                                        текущая_вершина=следующая_вершина;
                                        следующая_вершина=-1;
                                        if (текущая_вершина == b && пройдено[c] == -1 && ЕстьРебро(b,c))
                                        {
                                            ребро_пройдено = true;
                                            очередь[текущая_длина++] = текущая_вершина;
                                            пройдено[c] = текущая_вершина;
                                            текущая_вершина = c;
                                        }
                                        else
                                            if (текущая_вершина == c && пройдено[b] == -1 && ЕстьРебро(c, b))
                                            {
                                                ребро_пройдено = true;
                                                очередь[текущая_длина++] = текущая_вершина;
                                                пройдено[b] = текущая_вершина; текущая_вершина = b;
                                            }
                                }
                                if(следующая_вершина==a&&ребро_пройдено&&максимальная_длина<текущая_длина)
                                {
                                    максимальная_длина = текущая_длина;

                                    цикл = new int[максимальная_длина + 1];
                                    int s=0;
                                    for(int l=текущая_вершина;l!=-2;l=пройдено[l])
                                    {
                                        цикл[s] = l;
                                        s++;
                                    }
                                    цикл[s] = текущая_вершина;
                                }
                                следующая_вершина++;
                        }
                        else //ничего не найдено
                        {
                                // шаг назад
                                пройдено[текущая_вершина]=-1;
                                следующая_вершина=текущая_вершина+1;
                                if(текущая_вершина==c&&очередь[текущая_длина-1]==b||текущая_вершина==b&&очередь[текущая_длина-1]==c)
                                {
                                    ребро_пройдено=false;
                                }
                                текущая_вершина=очередь[--текущая_длина];
                        }
                }
                while (текущая_длина>0);
                if (максимальная_длина == 0) return false;
                for (int l = 0; l < максимальная_длина; l++)
                {
                    холст.соединить_вершины(цикл[l], цикл[l+1]);
                }
                return true;
        }
Exemplo n.º 3
0
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (граф.количество_вершин==0) return;

             Холст dr = new Холст(граф.количество_вершин, this.Width, this.Height - 70, e.Graphics, new Pen(Color.Black), new SolidBrush(this.BackColor), this.Font);

             double a=0;
             for(int j=0;j<граф.количество_вершин;j++)
             {
                for (int k=0;k<граф.количество_вершин;k++)
                if(граф.ЕстьРебро(j,k))
                    dr.соединить_вершины(j,k);
                a+=dr.step;
             }
             if(dialog1.dA!=-1&&dialog1.dB!=-1&&dialog1.dC!=-1)
             {
                dr.p.Width=4;
                if(граф.поиск_в_глубину(dr,dialog1.dA,dialog1.dB,dialog1.dC,dialog1.dD))
                {
                    this.statusStrip1.Items[0].Text="Цикл найден.";
                }
                else this.statusStrip1.Items[0].Text = "Нет таких циклов.";
                dr.p.Width=1;
             }
             for(int j=0;j<граф.количество_вершин;j++)
                dr.вершина(j);
        }
Exemplo n.º 4
0
        private int[] пройдено = new int[100]; // temp array
        public bool поиск_в_глубину(Холст холст, int a, int b, int c, int d)
        {
            int максимальная_длина = 0;

            for (int i = 0; i < 100; i++)
            {
                пройдено[i] = -1;
            }
            int[] очередь = new int[100];
            пройдено[a] = -2;
            int текущая_вершина = a;

            очередь[0] = a;
            int текущая_длина     = 1;
            int следующая_вершина = 0;

            int[] цикл           = new int[1];
            bool  ребро_пройдено = false;

            do
            {
                if (следующая_вершина < количество_вершин)
                {
                    for (; следующая_вершина < количество_вершин; следующая_вершина++)
                    {
                        if (ЕстьРебро(текущая_вершина, следующая_вершина))
                        {
                            break;
                        }
                    }
                }
                if (следующая_вершина < количество_вершин)
                {
                    if (пройдено[следующая_вершина] == -1)
                    {
                        // шаг вперед
                        очередь[текущая_длина++]    = текущая_вершина;
                        пройдено[следующая_вершина] = текущая_вершина;
                        текущая_вершина             = следующая_вершина;
                        следующая_вершина           = -1;
                        if (текущая_вершина == b && пройдено[c] == -1 && ЕстьРебро(b, c))
                        {
                            ребро_пройдено           = true;
                            очередь[текущая_длина++] = текущая_вершина;
                            пройдено[c]     = текущая_вершина;
                            текущая_вершина = c;
                        }
                        else
                        if (текущая_вершина == c && пройдено[b] == -1 && ЕстьРебро(c, b))
                        {
                            ребро_пройдено           = true;
                            очередь[текущая_длина++] = текущая_вершина;
                            пройдено[b] = текущая_вершина; текущая_вершина = b;
                        }
                    }
                    if (следующая_вершина == a && ребро_пройдено && максимальная_длина < текущая_длина)
                    {
                        максимальная_длина = текущая_длина;

                        цикл = new int[максимальная_длина + 1];
                        int s = 0;
                        for (int l = текущая_вершина; l != -2; l = пройдено[l])
                        {
                            цикл[s] = l;
                            s++;
                        }
                        цикл[s] = текущая_вершина;
                    }
                    следующая_вершина++;
                }
                else         //ничего не найдено
                {
                    // шаг назад
                    пройдено[текущая_вершина] = -1;
                    следующая_вершина         = текущая_вершина + 1;
                    if (текущая_вершина == c && очередь[текущая_длина - 1] == b || текущая_вершина == b && очередь[текущая_длина - 1] == c)
                    {
                        ребро_пройдено = false;
                    }
                    текущая_вершина =о чередь[--текущая_длина];
                }
            }while (текущая_длина > 0);
            if (максимальная_длина == 0)
            {
                return(false);
            }
            for (int l = 0; l < максимальная_длина; l++)
            {
                холст.соединить_вершины(цикл[l], цикл[l + 1]);
            }
            return(true);
        }