StoneCoder Ответов: 1

Как получить число 4-х размерных циклов в графе с заданной смежной матрицей?


My approach : using recursive DFS.

Note: i will be running this function for every vertex of graph and this approach works for very small values of vertices. How can i improve it or could u suggest any better/faster algo. Thanks:)


Что я уже пробовал:

static int size=0,source=0;

int ans=0;

void moddfs(int** edges,int N,int s,int visited[])

{

visited[s]=1;

if(size<3)

{

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

{

if(size==0)

{

source=s;

}

if(!visited[i] && edges[s][i])

{

size++;

moddfs(edges,N,i,visited);

}

}

}

else{

if(edges[source][s])

{

ans++;

}

}

visited[s]=0; size--;

}

1 Ответов

Рейтинг:
2

Patrice T

Цитата:
Как я могу улучшить его или вы можете предложить какой-либо лучший/более быстрый алгоритм.

Покажите вызывающий код с образцами данных, чтобы у нас было представление о том, что вы делаете с этой функцией.

Советовать:
- Двойной интервал между строками ничего не добавляет к вашему коду, он просто затрудняет его чтение.
- Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.
static int size=0,source=0;
int ans=0;
void moddfs(int** edges,int N,int s,int visited[])
{
    visited[s]=1;
    if(size<3)
    {
        for(int i=0;i<N;i++)
        {
            if(size==0)
            {
                source=s;
            }
            if(!visited[i] && edges[s][i])
            {
                size++;
                moddfs(edges,N,i,visited);
            }
        }
    }
    else{
        if(edges[source][s])
        {
            ans++;
        }
    }
    visited[s]=0;
    size--;
}

Стиль отступа - Википедия[^]

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]

[Обновление]
Цитата:
Как я могу улучшить его или вы можете предложить какой-либо лучший/более быстрый алгоритм.

Конечно, я могу дать вам прямое решение, но для вас это будет волшебство, вы ничего не узнаете из него.
Совершенствование алгоритма-это оптимизация.
Есть в основном 2 аспекта:
- Оптимизация кода: когда код неэффективен из-за быстрого и грязного написания. Вы можете использовать профилирование для определения горлышек бутылок. Профилирование (компьютерное программирование) - Википедия[^]
- Оптимизация алгоритма: именно здесь вы можете получить большой выигрыш. Это означает глубокое понимание проблемы и используемого алгоритма. Циклы 1234, 2341, 3412, 4123, 4321, 3214, 2143 и 1432-это все тот же цикл, вы должны установить правила, чтобы сохранить только 1 из них.
Вы должны посмотреть, могут ли другие правила сделать трюк и быть более эффективными.
Пример: скажем, что первый узел в цикле-это минимальное число узлов в цикле, это приведет к улучшению, потому что вам не нужно пробовать возможные связи с более низким числом узлов через цикл.
Является ли рекурсия лучшим способом получить ответы ?
...


StoneCoder

Спасибо за комментарий. Я обязательно буду иметь в виду ваш совет. Вот мой код водителя:

тап_п()
{
int N;
cin>>N;
int **ребра;
ребра=(int**)malloc(sizeof(int*)*N);
for(int i=0;i<n;i++)
{
="" края[я]="(инт*)Танос(оператор sizeof(тип int)*Н);
"для(int="" Ж="0;Дж&Л;П;J++в)
"cin="">>ребра[i][j];
}
}
int посетил[N];
for(int i=0;i

StoneCoder

вход:
8
0 1 0 1 1 0 0 0
1 0 1 0 0 1 0 0
0 1 0 1 0 0 1 0
1 0 1 0 0 0 0 1
1 0 0 0 0 1 0 1
0 1 0 0 1 0 1 0
0 0 1 0 0 1 0 1
0 0 0 1 1 0 1 0
Выход: 6

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.
Конец кода отсутствует.

StoneCoder

Вот это мыслитель!! Я подумаю над теми пунктами, которые вы упомянули. :)