BellmanFord判环算法
2015-09-16 16:59
141 查看
[code]#include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; const int MAXNODE = 510; const int MAXEDGE = 100010; typedef int Type; const Type INF = 0x3f3f3f3f; struct Edge{ int u, v, next; Type dis; Edge() {} Edge(int u, int v, Type dis, int next): u(u), v(v), dis(dis), next(next) {} }; struct BellmanFord{ int n, m; Edge edges[MAXEDGE]; bool inq[MAXNODE]; Type d[MAXNODE]; int p[MAXNODE], cnt[MAXNODE], head[MAXNODE]; void init(int n) { this->n = n; memset(head, -1, sizeof(head)); m = 0; } void AddEdge(int u, int v, Type dis) { edges[m] = Edge(u, v, dis, head[u]); head[u] = m++; } bool negativeCycle() { queue<int> Q; memset(inq, 0, sizeof(inq)); memset(cnt, 0, sizeof(cnt)); for (int i = 0; i < n; i++) { d[i] = INF; inq[i] = true; Q.push(i); } while (!Q.empty()) { int u = Q.front(); Q.pop(); inq[u] = false; for (int i = head[u]; ~i; i = edges[i].next) { int v = edges[i].v; if (d[v] > d[u] + edges[i].dis) { d[v] = d[u] + edges[i].dis; if (!inq[v]) { inq[v] = true; Q.push(v); if (++cnt[v] > n) return true; } } } } return false; } bool positiveCycle() { queue<int> Q; memset(inq, 0, sizeof(inq)); memset(cnt, 0, sizeof(cnt)); for (int i = 0; i < n; i++) { d[i] = 0; inq[i] = true; Q.push(i); } while (!Q.empty()) { int u = Q.front(); Q.pop(); inq[u] = false; for (int i = head[u]; ~i; i = edges[i].next) { int v = edges[i].v; if (d[v] < d[u] + edges[i].dis) { d[v] = d[u] + edges[i].dis; if (!inq[v]) { inq[v] = true; Q.push(v); if (++cnt[v] > n) return true; } } } } return false; } }bell; int main() { return 0; }
相关文章推荐
- 构建乘积数组
- ---------- 常用链接 ----------
- Java从包中读取所有的class文件
- Android快速开发常用工具类
- Java从包中读取所有的class文件
- 【LeetCode】Balanced Binary Tree 解题报告
- 「回溯法」Palindrome Partitioning
- nginx随着passenger构造ruby on rails页
- [动态规划]保存子问题的结果
- xenserver
- MySQL多实例安装
- 火车头采集器在线发布模块制作教程
- Get classpath for current running thread
- android Bitmap内存优化(四) android 本地资源图片的处理
- Android 实现ListView的A-Z字母排序及过滤搜索功能(通讯录)
- 安装Redis和Redis Cluster
- TCP报文段首部详解
- 学习Linux第三天
- sql语句:创建事物
- poj_2406 kmp