模板

并查集

class DisjointSet{
public:
    unordered_map<int, int> father;
    unordered_map<int, int> rank;
    int num_of_sets = 0;
    void add(int x){
        if(!father.count(x)){
            father[x] = -1;
            rank[x] = 0;
            num_of_sets++;
        }
    }
    int find(int x) {
        if (father[x] == -1) return x;
        else return find(father[x]);
    }
    bool is_connected(int x,int y){
        return find(x) == find(y);
    }
    void merge(int x, int y){
        x = find(x);
        y = find(y);
        if (x == y) return;
        if (rank[x] < rank[y]) {
            father[x] = y;
        }
        else {
            father[y] = x;
            if (rank[x] == rank[y]) rank[x]++;
        }
        num_of_sets--;
    }
    int get_num_of_sets(){
        return num_of_sets;
    }
};

拓扑排序

class Solution {
public:
    vector<vector<int>> edges; // 存储有向图
    vector<int> visited; // 标记每个节点的状态:0=未搜索,1=搜索中,2=已完成
    vector<int> result;  // 用数组来模拟栈
    bool valid = true; // 判断有向图中是否有环

    void dfs(int u) {
        visited[u] = 1; // 搜索其相邻节点, 只要发现有环,立刻停止搜索
        for (int v: edges[u]) {
            if (visited[v] == 0) {
                dfs(v); // 如果「未搜索」那么搜索相邻节点
                if (!valid) return;
            }
            else if (visited[v] == 1) {
                valid = false;  // 如果「搜索中」说明找到了环
                return;
            }
        }
        visited[u] = 2; // 将节点标记为「已完成」
        result.push_back(u); // 将节点入栈
    }

    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        edges.resize(numCourses);
        visited.resize(numCourses);
        for (const auto& info: prerequisites) {
            edges[info[1]].push_back(info[0]);
        }
        for (int i = 0; i < numCourses && valid; ++i) {
            if (!visited[i]) {  // 每次挑选一个「未搜索」的节点,开始进行深度优先搜索
                dfs(i);
            }
        }
        if (!valid) return {};
        reverse(result.begin(), result.end());
        return result;
    }
};

Floyd算法

const int INF = 1000000;
void floyd(vector<vector<int>>& dist) {
    int n = dist.size();
    for (int k = 0; k < n; k++) {
        for (int i = 0; i < n; i++) {
            if (dist[i][k] != INF) {
                for (int j = 0; j < n; j++) {
                    if (dist[i][j] > dist[i][k] + dist[k][j]) dist[i][j] = dist[i][k] + dist[k][j];
                }
            }
        }
    }
}

Dijkstra算法

void Dijkstra(vector<vector<int>> graph, vector<int>& dist) {
    int n = graph.size();
    vector<bool> used(n, false);
    for (int i = 0; i < n; ++i) {
        // 在还未确定最短路的点中,寻找距离最小的点
        int x = -1;
        for (int y = 0; y < n; ++y) {
            if (!used[y] && (x == -1 || dist[y] < dist[x])) {
                x = y;
            }
        }
        // 用该点更新所有其他点的距离
        used[x] = true;
        for (int y = 0; y < n; ++y) {
            dist[y] = min(dist[y], dist[x] + graph[x][y]);
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 简介 搜索迷宫(BFS+队列) 最短路Dijkstra+邻接矩阵Dijkstra+链式前向星+优先队列Bellma...
    染微言阅读 3,247评论 0 1
  • 一、数论 1)GCD GCD(求最大公约数) QGCD(快速GCD) extGCD(拓展GCD,解决ax + by...
    cJaven阅读 4,650评论 0 1
  • 动态规划(记忆化搜索) 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数...
    听松客未眠阅读 3,669评论 0 1
  • 数论快速幂高精度加法减法乘法除法线性筛素数埃氏筛法 O(nlglgn)最大公约数(gcd)最小公倍数(lcm)扩展...
    Lichers阅读 4,170评论 0 4
  • 1.树的重心[https://www.acwing.com/problem/content/description...
    Teresa_李庚希阅读 2,600评论 0 1

友情链接更多精彩内容