模板

并查集

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]);
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

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