簡體   English   中英

生成所有具有 n 個節點的無向​​圖

[英]Generate all undirected graphs with n nodes

我正在嘗試使用遞歸回溯生成所有具有 n 個節點的無向​​圖。 我必須將他們的矩陣(我不知道它在英語中如何稱呼 - 在我的語言中它是相鄰矩陣 - 是嗎?)到一個文件中。

例如:

輸入

3

輸出

8
0 0 0 
0 0 0 
0 0 0 

0 0 0 
0 0 1 
0 1 0 

0 0 1 
0 0 0 
1 0 0 

0 0 1 
0 0 1 
1 1 0 

0 1 0 
1 0 0 
0 0 0 

0 1 0 
1 0 1 
0 1 0 

0 1 1 
1 0 0 
1 0 0 

0 1 1 
1 0 1 
1 1 0 

這是我的程序:

#include <iostream>
#include <fstream>

using namespace std;

ifstream f("gengraf.in");
ofstream g("gengraf.out");

int st[100], n, adiacenta[100][100], l=1;

void tipar(int k)
{
    for (int i = 1; i < k; i++)
    {
        for (int j = i+1; j < k; j++)
        {
            adiacenta[i][j] = adiacenta[j][i] = st[l];
        }
        l++;
    }
    for (int i = 1; i < k; i++)
    {
        for (int j = 1; j < k; j++)
        {
            g << adiacenta[i][j] << " ";
        }
        g << endl;
    }
}

int valid(int k)
{
    return 1;
}

void back(int k)
{
    if (k == ((n - 1) * n / 2) + 1)
    {
        l = 1;
        tipar(k);
        g << endl;
    }
    else
    {
        for (int i = 0; i <= 1; i++)
        {
            st[k] = i;
            if (valid(k))
            {
                back(k + 1);
            }
        }
    }
}

int main()
{
    f >> n;
    g << pow(2, (n * (n - 1))/2);
    g << endl;
    back(1);
}

但我的輸出是:

8
0 0 0 
0 0 0 
0 0 0 

0 0 0 
0 0 0 
0 0 0 

0 0 0 
0 0 1 
0 1 0 

0 0 0 
0 0 1 
0 1 0 

0 1 1 
1 0 0 
1 0 0 

0 1 1 
1 0 0 
1 0 0 

0 1 1 
1 0 1 
1 1 0 

0 1 1 
1 0 1 
1 1 0 

我不知道如何解決這個問題。

我明白為什么會發生 - 我生成了 2^(n*(n-1))/2) 個圖(因為這是有 n 個節點的無向​​圖的數量),而不是生成 8 個不同的圖,我只得到 4 個不同的圖, 顯示 2 次。

那是(我想)因為我的程序輸出了一個圖,比如說,節點 1 和 3 之間有一個鏈接,另一個圖在節點 3 和 1 之間有一個鏈接。這基本上是相同的無向圖。

所以如果我是對的,我應該讓我的程序不顯示每個圖形兩次,它應該可以工作。 所以基本上我必須用“反向”節點擺脫每個圖(所以如果我得到一個鏈接在 1 和 3 之間的圖表,我不應該得到另一個鏈接在 3 和 1 之間的圖表,因為它們是相同的) .

我對嗎?

如果是這樣,我該怎么做?

謝謝。

您的代碼存在的問題:

  • 賦值后, tipar() id 中的l值沒有增加。
  • 鄰接矩陣的大小是 n * n 而不是 k * k。

此代碼按預期工作。

#include <iostream>
#include <fstream>

using namespace std;

ifstream f("gengraf.in");
ofstream g("gengraf.out");

int st[100], n, adiacenta[100][100], l=1;

int pow(int a, int b) {
    int r = 1;
    while (b) {
    if (b&1) r *= a;
    b >>= 1;
    a *= a;
    }
    return r;
}

void tipar()
{
    for (int i = 1; i <= n; i++)
    {
        for (int j = i+1; j <= n; j++)
        {
            adiacenta[i][j] = adiacenta[j][i] = st[l];
            l++;
        }
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            g << adiacenta[i][j] << " ";
        }
        g << endl;
    }
}

int valid(int k)
{
    return 1;
}

void back(int k)
{
    if (k == (n * (n-1) / 2) + 1)
    {
        l = 1;
        tipar();
        g << endl;
    }
    else
    {
        for (int i = 0; i <= 1; i++)
        {
            st[k] = i;
            if (valid(k))
            {
                back(k+1);
            }
        }
    }
}

int main()
{
    cin >> n;
    g << pow(2, (n * (n - 1))/2);
    g << endl;
    back(1);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM