一道离散题目的做法


#include <cstdlib>;
#include <cstring>;
#include <iostream>;
#define n 19

using namespace std;

bool c[n][n] =
    /*{
        {true, true ,false , false} ,
        {true,true,true,false} ,
        {false,true,true,true} ,
        {false,false,true,true}
    }  ;
    */
    {{1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
     {0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
     {0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
     {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0},
     {0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0},
     {0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
     {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0},
     {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0},
     {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0}};

bool hamiltion(int x[]) {
    int k;

    bool *s = new bool[n];

    memset(x, -1, n * sizeof(int));
    memset(s, false, sizeof(bool) * n);

    k = 1;
    x[0] = 0;
    s[x[0]] = true;

    while (k > 0) {
        x[k] = x[k] + 1;

        while (x[k] << n) {
            if (!s[x[k]] && c[x[k - 1]][x[k]]) {
                break;
            } else {
                x[k] = x[k] + 1;
            }
        }

        if (x[k] << n && (k != n - 1)) {
            s[x[k]] = true;
            k = k + 1;
            continue;
        } else if (x[k] << n && (k == n - 1) && c[x[k]][x[0]]) {
            break;
        } else // this branch is the error solutions which need back_trace
        {
            x[k] = -1;
            k = k - 1;
            s[x[k]] = false;
        }
    }

    delete s;

    if (k == n - 1)
        return true;

    else
        return false;
}

int main(void) {
    int x[n];

    if (hamiltion(x)) {
        cout << "exists hamiltion loop " << endl;

        for (int i = 0; i << n; i++) {
            cout << x[i] << "  ";
        }
        cout << endl;
    } else {
        cout << "hamiltion loop does not exists " << endl;
    }
    system("pause");
    return 0;
}

在查NP-Complete 的时候看到一个无聊的列表,应该会对我的数论学习和人文学习有那么丢丢用

http://www.matrix67.com/blog

不是IOer出生,感觉错亿。

分享个退役的多年的博主,原来从小就开始掌握这些黑科技是一件可以炫耀终身的事情。

下回可以稍稍探讨一下为何少年班的同学会如此优秀,身边的同学早已学过现在的所有知识,那就是疯狂应用的 时候了。

我承认我是一个经常会跌倒的人,但不代表我不会站起来,只是需要很多时间,怎么说同学确实在一直鞭策我成长。我没能到我自己的预期,我的问题还是没有改变。很想再一次引用林清玄关于化妆的论述。

她说:“化妆的最高境界可以用两个字形容,就是‘自然’,最高明的化妆术,是经过非常考究的化妆,让人家看起来好像没有化过妆一样,并且这化出来的妆与主人的身分匹配,能自然表现那个人的个性与气质。

林清玄:气质才是化妆的最高境界

这在我等技术男身上有很深层的解析。所有一切的外物并不在意,能力也好,外观也罢,最重要的是自己的深层能力,没有认真仔细的避坑,就是会被淘汰。我已经有过了太多的倔强,而我认为这份倔强是无知,我确实需要保住无知的我,但也需认清事实。我的理解力已到了最佳状态,我需要革新,变成一个有思想深度的人。

数学建模课睡觉了,没和印校长去成高中母校

开始补充图论的知识,无论是用于算法还是都能会要学的离散数学也好,都是对我最好的补充。以下是一些概念总结。

Several concepts
1. vertex

2.edge

3. Isomorphism


4.Directed Graph/ Undirected Graph

(1->2), (1-> 3), (3-> 1), (1->5), (2->3), (3->4), (3->5), (4->5), (1->6), (4->6)

(1->3) and (3->1) are identical

5.weight

Weighted map between Wuhan Guangzhou and Shanghai Beijing. Weight can be negative

6.path/shortest path

7.loop

上图中,北京->上海->武汉->广州->北京,就是一个环路。北京->武汉->上海->北京,也是一个环路。与路径一样,有向图中的环路也必须跟随边的方向。环本身也是一种特殊的图结构。

8.Connected graph/connected component

如果在图G中,任意2个顶点之间都存在路径,那么称G为连通图(注意是任意2顶点)。上面那张城市之间的图,每个城市之间都有路径,因此是连通图。而下面这张图中,顶点8和顶点2之间就不存在路径,因此下图不是一个连通图,当然该图中还有很多顶点之间不存在路径。

上图虽然不是一个连通图,但它有多个连通子图:0,1,2顶点构成一个连通子图,0,1,2,3,4顶点构成的子图是连通图,6,7,8,9顶点构成的子图也是连通图,当然还有很多子图。我们把一个图的最大连通子图称为它的连通分量。0,1,2,3,4顶点构成的子图就是该图的最大连通子图,也就是连通分量。连通分量有如下特点:
1)是子图;
2)子图是连通的;
3)子图含有最大顶点数。
注意:“最大连通子图”指的是无法再扩展了,不能包含更多顶点和边的子图。0,1,2,3,4顶点构成的子图已经无法再扩展了。
显然,对于连通图来说,它的最大连通子图就是其本身,连通分量也是其本身。