文章目录

  • 问题 A: 邻接矩阵存储的图,节点的出度和入度计算(附加代码模式)
  • 问题 B: 算法7-12:有向无环图的拓扑排序
  • 问题 C: 有向图是否存在环?
  • 问题 D: 图-节点的最早发生时间
  • 问题 E: 图-节点的最迟发生时间
  • 问题 F: 图-图的关键路径

注:前面几个题基本上是最后一个题改过来的,如有错误,欢迎指正

问题 A: 邻接矩阵存储的图,节点的出度和入度计算(附加代码模式)

#include <iostream>
#include <cstdio>
using namespace std;#define MAX_SIZE 100struct Graph{int nodeNumber;int adjMatrix[MAX_SIZE][MAX_SIZE];
};// 计算每个节点的出度和入度
void CalculateDegree(const Graph& g, int inDegree[], int outDegree[]){int n=g.nodeNumber;for( int i=0;i<n;i++){for( int j=0;j<n;j++){if(g.adjMatrix[i][j]==0) continue;inDegree[j]++;outDegree[i]++;}}
}please comment the following code when you submit to OJ
int main(){// freopen("/config/workspace/answer/test.in","r",stdin);Graph g;cin >> g.nodeNumber;int inDegree[g.nodeNumber] = {0}, outDegree[g.nodeNumber] = {0};for(int i=0;i<g.nodeNumber;i++){for(int j=0;j<g.nodeNumber;j++){cin >> g.adjMatrix[i][j];}}CalculateDegree(g, inDegree, outDegree);for(int i=0;i<g.nodeNumber;i++){cout << inDegree[i] << " " << outDegree[i] << endl;}return 0;
}

问题 B: 算法7-12:有向无环图的拓扑排序

#include <bits/stdc++.h>
using namespace std;
const int N = 1100;
struct p
{int from, to, val;
} edge[N];
int w[N][N];
vector<int> ans;
int e[N], l[N], ve[N], vl[N];
int top_sort(int n)
{int indeg[N] = {};for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (w[i][j] == 0)continue;indeg[j]++;}}stack<int> Point;for (int j = 0; j < n; j++){if (indeg[j] == 0){Point.push(j);}}while (!Point.empty()){int ne = Point.top();Point.pop();ans.push_back(ne);for (int j = 0; j < n; j++){if (w[ne][j] != 0)indeg[j]--;elsecontinue;if (indeg[j] == 0){Point.push(j);}}}if (ans.size() != n)return -1;return 0;
}int main()
{int n;cin >> n;for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){cin >> w[i][j];}}if (top_sort(n) == -1){cout << "ERROR" << endl;}else{for (int i = 0; i < ans.size(); i++){cout << ans[i] << " ";}}return 0;
}

问题 C: 有向图是否存在环?

#include <bits/stdc++.h>
using namespace std;
const int N = 1100;
struct p
{int from, to, val;
} edge[N];
int w[N][N];
vector<int> ans;
int e[N], l[N], ve[N], vl[N];
int top_sort(int n)
{int indeg[N] = {};for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){if (w[i][j] == 0)continue;indeg[j]++;}}stack<int> Point;for (int j = 1; j <= n; j++){if (indeg[j] == 0){Point.push(j);}}while (!Point.empty()){int ne = Point.top();Point.pop();ans.push_back(ne);for (int j = 1; j <= n; j++){if (w[ne][j] != 0)indeg[j]--;elsecontinue;if (indeg[j] == 0){Point.push(j);}}}if (ans.size() != n)return -1;return 0;
}int main()
{int n, m;while (cin >> n >> m){if (n == 0 && m == 0)break;memset(w, 0, sizeof(w));ans.clear();for (int i = 0; i < m; i++){int a, b;cin >> a >> b;w[a][b] = 1;}if (top_sort(n) == -1){cout << "YES" << endl;}else{cout << "NO" << endl;}}return 0;
}

问题 D: 图-节点的最早发生时间

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
struct p
{int from, to, val;
} edge[N];
int w[N][N];
vector<int> ans;
int e[N], l[N], ve[N], vl[N];
int top_sort(int n)
{int indeg[N] = {};for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (w[i][j] == 0)continue;indeg[j]++;}}stack<int> Point;for (int j = 0; j < n; j++){if (indeg[j] == 0){Point.push(j);}}while (!Point.empty()){int ne = Point.top();Point.pop();ans.push_back(ne);for (int j = 0; j < n; j++){if (w[ne][j] != 0)indeg[j]--;elsecontinue;if (indeg[j] == 0){Point.push(j);}}}if (ans.size() != n)return -1;return 0;
}void cal(int n)
{for (int i = 0; i < ans.size(); i++){int now = ans[i];for (int j = 0; j < n; j++){if (w[now][j] == 0)continue;ve[j] = max(ve[now] + w[now][j], ve[j]);}}for (int i = 0; i < ans.size(); i++){vl[i] = ve[ans[ans.size() - 1]];}for (int i = ans.size() - 1; i >= 0; i--){int now = ans[i];for (int j = 0; j < n; j++){if (w[now][j] == 0)continue;vl[now] = min(vl[j] - w[now][j], vl[now]);}}return;
}
int main()
{int n, m;cin >> n >> m;for (int i = 0; i < m; i++){int a, b, c;cin >> a >> b >> c;w[a][b] = c;edge[i].from = a;edge[i].to = b;edge[i].val = c;}top_sort(n);cal(n);for (int i = 0; i < n; i++){cout << ve[i] << endl;}return 0;
}

问题 E: 图-节点的最迟发生时间

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
struct p
{int from, to, val;
} edge[N];
int w[N][N];
vector<int> ans;
int e[N], l[N], ve[N], vl[N];
int top_sort(int n)
{int indeg[N] = {};for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (w[i][j] == 0)continue;indeg[j]++;}}stack<int> Point;for (int j = 0; j < n; j++){if (indeg[j] == 0){Point.push(j);}}while (!Point.empty()){int ne = Point.top();Point.pop();ans.push_back(ne);for (int j = 0; j < n; j++){if (w[ne][j] != 0)indeg[j]--;elsecontinue;if (indeg[j] == 0){Point.push(j);}}}if (ans.size() != n)return -1;return 0;
}void cal(int n)
{for (int i = 0; i < ans.size(); i++){int now = ans[i];for (int j = 0; j < n; j++){if (w[now][j] == 0)continue;ve[j] = max(ve[now] + w[now][j], ve[j]);}}for (int i = 0; i < ans.size(); i++){vl[i] = ve[ans[ans.size() - 1]];}for (int i = ans.size() - 1; i >= 0; i--){int now = ans[i];for (int j = 0; j < n; j++){if (w[now][j] == 0)continue;vl[now] = min(vl[j] - w[now][j], vl[now]);}}return;
}
int main()
{int n, m;cin >> n >> m;for (int i = 0; i < m; i++){int a, b, c;cin >> a >> b >> c;w[a][b] = c;edge[i].from = a;edge[i].to = b;edge[i].val = c;}top_sort(n);cal(n);for (int i = 0; i < n; i++){cout << vl[i] << endl;}return 0;
}

问题 F: 图-图的关键路径

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
struct p
{int from, to, val;
} edge[N];
int w[N][N];
vector<int> ans;
int e[N], l[N], ve[N], vl[N];
int top_sort(int n)
{int indeg[N] = {};for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (w[i][j] == 0)continue;indeg[j]++;}}stack<int> Point;for (int j = 0; j < n; j++){if (indeg[j] == 0){Point.push(j);}}while (!Point.empty()){int ne = Point.top();Point.pop();ans.push_back(ne);for (int j = 0; j < n; j++){if (w[ne][j] != 0)indeg[j]--;elsecontinue;if (indeg[j] == 0){Point.push(j);}}}if (ans.size() != n)return -1;return 0;
}void cal(int n)
{for (int i = 0; i < ans.size(); i++){int now = ans[i];for (int j = 0; j < n; j++){if (w[now][j] == 0)continue;ve[j] = max(ve[now] + w[now][j], ve[j]);}}for (int i = 0; i < ans.size(); i++){vl[i] = ve[ans[ans.size() - 1]];}for (int i = ans.size() - 1; i >= 0; i--){int now = ans[i];for (int j = 0; j < n; j++){if (w[now][j] == 0)continue;vl[now] = min(vl[j] - w[now][j], vl[now]);}}return;
}
int main()
{int n, m;cin >> n >> m;for (int i = 0; i < m; i++){int a, b, c;cin >> a >> b >> c;w[a][b] = c;edge[i].from = a;edge[i].to = b;edge[i].val = c;}top_sort(n);cal(n);for (int i = 0; i < m; i++){e[i] = ve[edge[i].from];l[i] = vl[edge[i].to] - w[edge[i].from][edge[i].to];if (e[i] == l[i]){printf("%d-->%d:%d\n", edge[i].from, edge[i].to, e[i]);}}return 0;
}

BUCT数据结构——图(拓扑排序、关键路径)相关推荐

  1. 【算法数据结构体系篇class16】:图 拓扑排序

    一.图 1)由点的集合和边的集合构成 2)虽然存在有向图和无向图的概念,但实际上都可以用有向图来表达 3)边上可能带有权值 二.图结构的表达 1)邻接表法 类似哈希表, key就是当前节点.value ...

  2. 数据结构C++——拓扑排序

    数据结构C++--拓扑排序 文章目录 数据结构C++--拓扑排序 一.前言 二.拓扑排序的概念及作用 三.拓扑排序的实现 ①拓扑排序的实现原理 ②拓扑排序中FindInDegree()函数的实现 ③拓 ...

  3. 【数据结构】拓扑排序

    如果一个有向图中没有包含简单的回路,这样的图为有向无环图. 图中的顶点代表事件(活动),图中的有向边说明了事件之间的先后关系.这种用顶点表示活动,用弧表示活动时间的优先关系的有向图称为顶点表示活动的网 ...

  4. LeetCode 802. 找到最终的安全状态(逆向图+拓扑排序)

    文章目录 1. 题目 2. 解题 1. 题目 在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走. 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止. 现在, 如果我们最后 ...

  5. 有向无环图的拓扑排序 关键路径

    拓扑排序:在不违背先决条件的基础上将有向无环图排成线性序列 - 排序结果不唯一 - 用一维数组Indegree存储各顶点的入度 - 采用邻接表与队列 bool TopSort(LGraph Graph ...

  6. 拓扑排序--关键路径

    拓扑排序和关键路径是基于无环的有向图. 主要用来表示工程进度中各个事件之间的关系. 拓扑排序和关键路径 使用邻接表存储数据,最小生成树和最短路径用 邻接矩阵 存储数据. 1.拓扑排序 AOV网:在一个 ...

  7. 数据结构-图论-拓扑排序模板题(hdu3342)(poj1270)(hdu4857)

    dfs与bfs的很直接的应用就是拓扑排序. 拓扑排序如果用数组来模拟链表进行操作,既解决了稀疏图的空间问题,又解决了用链表进行操作麻烦的问题 但是拓扑排序并不是数字大小之间的排序,而是某些事情之间的顺 ...

  8. hdu 4109 Instrction Arrangement 拓扑排序 关键路径

    这个算是关键路径的模版题目了,解这个题目之前,首先说下关键路径的含义,传送门(度娘),个人的见解是,关键路径就是木桶的短板问题,比如有一群人约好去某个地方,大家从同一个地方同一时间开始出发,有些人选择 ...

  9. 判断图有无环_浅谈什么是图拓扑排序

    1 引言   在工程实践中,一个工程项目往往由若干个子项目组成.这些子项目间往往有两种关系:   (1) 先后关系,即必须在某个项完成后才能开始实施另一个子项目.   (2) 子项目间无关系,即两个子 ...

最新文章

  1. poj2516 最小费用最大流
  2. GDCM:gdcm::VL 的测试程序
  3. 成人高考 计算机英语作文,2017年成人高考英语作文范文
  4. mindi linux 使用教程,Linux使用入门教程之tuned
  5. python脚本自动消除安卓版_python脚本中appium的自启动自关闭
  6. 计算机组成原理平均cpi怎么算_2020考研 | 计算机统考408院校盘点,408考试内容难易分析...
  7. varnish关于Grace mode和Saint mode这两中模式配置
  8. 别人家只会编段子,谷歌带大家找乐子 | 愚人节の真 · 大型线下踏春游戏
  9. [SDOI2015] 序列统计
  10. 从马克思看计算机科学,从马克思主义的角度,用科学精神来看生死观,应该说已经解决,或...
  11. 51单片机定时器问题总结
  12. 工程伦理思考题汇总——张永强主编
  13. ps如何把自己的图与样机结合_Ps如何套用样机图?
  14. python电影名称词云_python wordcloud 对电影《我不是潘金莲》制作词云
  15. 怎么用python编简单游戏大全_适合新手练手的三个python简单小游戏
  16. 过压过流保护芯片完整篇
  17. C#长链接转短链接(调用新浪api)
  18. 风向值与风向描述定义
  19. K8S容器编排之POD健康监控
  20. PayPal收款手续费是多少钱?

热门文章

  1. windows无法telnet解决办法
  2. 机器学习/深度学习资源下载合集(持续更新...)
  3. Linux内核网络结构,和收发数据基本流程
  4. FPGA仿真--前仿真和后仿真
  5. mysql工作日_mysql自定义函数计算时间段内的工作日(支持跨年)
  6. [含lw+源码等]javaweb银行柜员业务绩效考核系统
  7. 【产业互联网周报】顺丰科技与圣辉征信达成数据流通合作;微软考虑模仿微信,建超级App;中国移动启动算力网络科学装置;...
  8. Oracle卸载:指定数据库的诊断目标位置不存在解决
  9. HTML的子代选择器
  10. 如何创建自己的 Google Chrome 扩展程序