基于韦尔奇·鲍威尔法对图着色 含c++代码

期末考试前面的最后一次离散数学编程作业,十分感慨。

一学期的离散数学学习,让我懂得了不能说是整个离散数学的体系吧,也可以说是一点也听不懂了,现在正值6月13号这么一个神圣的日子,我不禁感叹:我真的不想挂科。但是这门折磨的所谓的“专业课”也就到此为止了,或余实不合科研之路,只得目光短浅于两三前后端之琐事。故人各有志,非众生皆可忍导师压榨之苦、论文枯竭之苦,愚且鼠目寸光之辈哉,且浮于浅显之处乎!遂钟写此篇,抒己浅志,且造福于众生也。


代码如下:(望君付师作业时稍加改动,不至连坐之刑也)

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;

class Node {
private:
    int degree;
    int color = -1;
    int number;
    static int maxColor;
    vector<int> connected;
public:
    explicit Node(int degree = 0, int number = 0) : degree(degree), number(number) {}
    ~Node() = default;
    int getDegree() const;
    int getColor() const;
    int getNumber() const;
    void setDegree(const int& d);
    void setColor(const int& c);
    void setNumber(const int& n);
    void pushNode(const int& n);
    static void setMaxColor(const int& max);
    static int getMaxColor();
    bool find(Node* node);
    bool operator>=(const Node& node) const;
};

int Node::maxColor = -1;

int Node::getDegree() const {
    return degree;
}

int Node::getNumber() const {
    return number;
}

int Node::getColor() const {
    return color;
}

void Node::setColor(const int &c) {
    color = c;
}

void Node::setNumber(const int &n) {
    number = n;
}

void Node::setDegree(const int &d) {
    degree = d;
}

void Node::pushNode(const int &n) {
    connected.push_back(n);
    degree++;
}

bool Node::find(Node *node) {
    for (auto &item: connected) {
        if (item == node->number) {
            return true;
        }
    }
    return false;
}

void Node::setMaxColor(const int &max) {
    if (maxColor < max) {
        maxColor = max;
    }
}

int Node::getMaxColor() {
    return maxColor;
}

bool Node::operator>=(const Node& node) const {
    return degree >= node.degree;
}

bool cmp(Node* a, Node* b) {
    return a->getDegree() > b->getDegree();
}

class Graph{
private:
    vector<Node*> nodes;
public:
    Graph() = default;
    ~Graph() = default;
    void init(vector<vector<int>>& matrix);
    bool isColored();
    void showColor();
    void startColor();
};

void Graph::init(vector<vector<int>> &matrix) {
    for (int i = 0; i < matrix.size(); i++) {
        auto node = new Node(0, i + 1);
        for (int j = 0; j < matrix[i].size(); j++) {
            if (i == j) {
                continue;
            } else if (matrix[i][j] == 1) {
                node->pushNode(j + 1);
            }
        }
        nodes.push_back(node);
    }
    sort(nodes.begin(), nodes.end(), cmp);
    nodes[0]->setColor(0);
    Node::setMaxColor(0);
}

bool Graph::isColored() {
    for (const auto &item: nodes) {
        if (item->getColor() == -1) {
            return false;
        }
    }
    return true;
}

void Graph::showColor() {
    cout << "--------------------------" << endl;
    for (int i = 0; i < nodes.size(); i++) {
        if (i != nodes.size() - 1) {
            cout << "v" << i + 1 << ":" << nodes[i]->getColor() << ",";
        } else {
            cout << "v" << i + 1 << ":" << nodes[i]->getColor();
        }
    }
    cout << endl;
    cout << "--------------------------" << endl;
}

void Graph::startColor() {
    for (int i = 1; i < nodes.size(); i++) {
        int check = 0;
        for (int j = 0; j < i; j++) {
            if (nodes[i]->find(nodes[j])) {
                continue;
            } else {
                nodes[i]->setColor(nodes[j]->getColor());
                check = 1;
                break;
            }
        }
        if (check == 0) {
            nodes[i]->setColor(Node::getMaxColor() + 1);
            Node::setMaxColor(nodes[i]->getColor());
        }
    }
}

int main() {
    vector<vector<int>> matrix;
    int n;
    cout << "输入节点个数" << endl;
    cin >> n;
    cout << "输入邻接矩阵" << endl;
    cout << "  ";
    for (int i = 0; i < n; i++) {
        cout << i + 1 << " ";
    }
    cout << endl;
    for (int i = 0; i < n; i++) {
        vector<int> temp;
        cout << i + 1 << " ";
        for (int j = 0; j < n; j++) {
            int value;
            cin >> value;
            temp.push_back(value);
        }
        matrix.push_back(temp);
    }
    Graph p;
    p.init(matrix);
    p.startColor();
    p.showColor();
    return 0;
}

愚尚且不及佬也,若有不慎之处,恳请指正于评论区。