图论相关算法

转载自:http://cojs.tk/cogs/page/page.php?aid=30

 

    • 最小生成树

      • Kruskal+ufs
      •  1 int ufs(int x) {
         2        return f[x] == x ? x : f[x] = ufs(f[x]); } int Kruskal() {
         3        int w = 0;
         4        for(int i=0; i<n; i++)
         5            f[i] = i;
         6        sort(e, e+n);
         7        for(int i=0; i<n; i++) {
         8            int x = ufs(e[i].u), y = ufs(e[i].v);
         9            if(x != y) {
        10                f[x] = y;
        11                w += e[i].w;
        12            }
        13        } return w; }
      • Prim

         1 int Prim() {
         2        int w = 0;
         3        priority_queue<pair<int, int> > q;
         4        bool l[N] = {0};
         5        l[1] = 1; q.push(make_pair(0, 1));
         6        for(int k=1; k<n; k++) {
         7            int u = q.top().second; q.pop();
         8            for(int i=0; i<G[u].size(); i++)
         9                if(!l[G[u][i]])
        10                    q.push(make_pair(-c[u][i], G[u][i]));
        11            while(!q.empty() && l[q.top().second])
        12                q.pop();
        13            l[q.top().second] = 1;
        14            w += -q.top().first;
        15            q.pop();
        16        } return w; }
  • 最短路径
    •  Dijkstra+priority_queue

       1 void Dijkstra(int s) {
       2        priority_queue<pair<int, int> > q;
       3        bool l[N] = {0}; l[s] = 1;
       4        fill_n(f, n, INF); f[s] = 0;
       5        q.push(make_pair(-f[s], s));
       6        while(!q.empty()) {
       7            int u = q.front().second; q.pop();
       8            for(int i=0; i<G[u].size(); i++) {
       9                int v = G[u][i];
      10                if(f[v] > f[u] + c[u][i]) {
      11                    f[v] = f[u] + c[u][i];
      12                    if(!l[v]) {
      13                        l[v] = 1;
      14                        q.push(make_pair(-f[v], v));
      15                    }
      16                }
      17            }
      18        } }
    • Bellman-Ford (SPFA)

       1 void BellmanFord(int s) { // SPFA
       2        queue<int> q;
       3        bool l[N] = {0}; l[s] = 1;
       4        fill_n(f, n, INF); f[s] = 0;
       5        q.push(s);
       6        while(!q.empty()) {
       7            int u = q.front(); q.pop();
       8            l[u] = 0;
       9            for(int i=0; i<G[u].size(); i++) {
      10                int v = G[u][i];
      11                if(f[v] > f[u] + c[u][i]) {
      12                    f[v] = f[u] + c[u][i];
      13                    if(!l[v]) {
      14                        l[v] = 1;
      15                        q.push(v);
      16                    }
      17                }
      18            }
      19        } }
    • Floyd

      1 void Floyd() {
      2        for(int k=0; k<n; k++)
      3            for(int i=0; i<n; i++)
      4                for(int j=0; j<n; j++)
      5                    f[i][j] = min(f[i][j], f[i][k] + f[k][j]); }
  • 二分图
    • ufs 验证 Hungary

       1 bool DFS(int u) {
       2        for(int i=0; i<G[u].size(); i++) {
       3            int v = G[u][i];
       4            if(!l[v]) {
       5                l[v] = 1;
       6                if(!f[v] || DFS(f[v])) {
       7                    f[v] = u;
       8                    return true;
       9                }
      10            }
      11        } return false; } int Hungary() {
      12        int w = 0;
      13        for(int i=0; i<n; i++) {
      14            fill_n(l, l+n, 0);
      15            if(DFS(i))
      16                w++;
      17        } return w; }
  • 连通分量
    • Tarjan stack

       1 <int> s; void Tarjan(int u) {
       2        dfn[u] = low[u] = ++time;
       3        l[u] = 1;
       4        s.push(u);
       5        for(int i=0; i<G[u].size(); i++) {
       6            int v = G[u][i];
       7            if(!dfn[v]) {
       8                Tarjan(v);
       9                low[u] = min(low[u], low[v]);
      10            } else if(l[v])
      11                low[u] = min(low[u], dfn[v]);
      12        }
      13        if(dfn[u] == low[u]) {
      14            w++;
      15            do {int v;
      16                l[v = s.top()] = 0;
      17                f[v] = w;
      18                s.pop();
      19            } while(u != v);
      20        } } void SCC() {
      21        fill_n(dfn, n, 0);
      22        for(int i=0; i<n; i++)
      23            if(!dfn(i))
      24                Tarjan(i); }
  • 网络流
    • 费用流:Bellman-Ford 找增广路,或者用贪心求解
    • 最大流:Edmonds-Karp
时间: 2024-10-13 00:54:26

图论相关算法的相关文章

图论(A*算法,K短路) :POJ 2449 Remmarguts&#39; Date

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤(转)

第 2 部分: 深入推荐引擎相关算法 - 协同过滤 本系列的第一篇为读者概要介绍了推荐引擎,下面几篇文章将深入介绍推荐引擎的相关算法,并帮助读者高效的实现这些算法. 在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法.它以其方法模型简单,数据依赖性低,数据方便采集 , 推荐效果较优等多个优点成为大众眼里的推荐算法“No.1”.本文将带你深入了解协同过滤的秘密,并给出基于 Apache Mahout 的协同过滤算法的高效实现.Apache Mahout 是 ASF 的一个

数据结构(C语言版)顺序栈相关算法的代码实现

这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的是从栈底想栈顶方向运行visit()函数,这是之前的学习中所忽略的:栈的遍历解除了栈的输出顺序只能从栈顶像栈底方向的限制. 二.清空栈时要不要将stacksize重置 网上看到有的人在实现清空栈这一功能时,将stacksize重置为0,我觉得有点问题,起初的想法是将其重置为初始化时的值,在与同学讨论

【uva 658】It&#39;s not a Bug, it&#39;s a Feature!(图论--Dijkstra算法+二进制表示)

题意:有n个潜在的bug和m个补丁,每个补丁用长为n的字符串表示.首先输入bug数目以及补丁数目.然后就是对m 个补丁的描述,共有m行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,地一个字符串 是对软件的描述,只有软件处于该状态下才能打该补丁该字符串的每一个位置代表bug状态(-代表该位置没bug,+代 表该位置有bug,0表示该位置无论有没有bug都可打补丁).然后第二个字符串是对打上补丁后软件状态的描述 -代表该位置上的bug已经被修复,+表示该位置又引入了一个新的bug

加密类型及其相关算法

在互联网通信过程中,如何保证数据的安全性? 在通信过程中,数据安全主要从三个方面考虑:机密性(数据的内容不能被窃取) 完整性(数据的内容不能被修改) 身份验证(确定通信双方的身份) 加密类型:1.对称加密,加密和解密使用同一个密钥,但是密钥如何安全传输比较重要,对称加密数度较快,适于加密数据 2.单向加密,提取数据指纹,主要用于保证数据的完整性 单向加密的特点:输入相同则输出一定相同 雪崩效应:输入的微小改变会引起结果的巨大反差 定长输出 3.非对称加密,使用一对密钥(public-key和pr

探索推荐引擎内部的秘密,第 3 部分: 深入推荐引擎相关算法 - 聚类

聚类分析 什么是聚类分析? 聚类 (Clustering) 就是将数据对象分组成为多个类或者簇 (Cluster),它的目标是:在同一个簇中的对象之间具有较高的相似度,而不同簇中的对象差别较大.所以,在很多应用中,一个簇中的数据对象可以被作为一个整体来对待,从而减少计算量或者提高计算质量. 其实聚类是一个人们日常生活的常见行为,即所谓"物以类聚,人以群分",核心的思想也就是聚类.人们总是不断地改进下意识中的聚类模式来学习如何区分各个事物和人.同时,聚类分析已经广泛的应用在许多应用中,包

linux学习之路之加密类型及其相关算法

加密类型及其相关算法 随着互联网越演越烈,互联网上的各种攻击层出不穷,因此在互联网上相互传递的信息越来越不安全,因此为了防止用户在互联网上传递的数据被窃取,因此我们很有必须加强传递的数据的安全性. 数据的安全性主要包括以下三个方面: 数据的机密性:保证传递的数据不被读取 要想使传递的数据不被读取,可以对这些数据进行加密,因为默认这些数据是以明文来传递的 整个加密过程可以这么来理解: 加密:plaintext--->转换规则--->ciphertext 解密:ciphertext--->转

二分查找的相关算法题

最近笔试经常遇到二分查找的相关算法题 1)旋转数组中的最小数字 2)在旋转数组中查找某个数 2)排序数组中某个数的出现次数 下面我来一一总结 1 旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 实现数组的旋转见左旋转字符串. 和二分查找法一样,用两个指针分别指向数组的第一个元素和最后一个元素. 我们注意到旋转

深入推荐引擎相关算法 - 协同过滤

集体智慧和协同过滤 什么是集体智慧 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web 应用中利用集体智慧构建更加有趣的应用或者得到更好的用户体验.集体智慧是指在大量的人群的行为和数据中收集答案,帮助你对整个人群得到统计意义上的结论,这些结论是我们在单个个体上无法得到的,它往往是某种趋势或者人群中共性的部分. Wikipedia 和 Google 是两个典型的利用集体智慧的 Web 2.0 应用: Wikip