当前位置: 首页 > news >正文

C++ 拓扑排序

算法描述:

1 统计每个节点的入度

2 选择一个入度为0的顶点u放入结果列表

3 删除顶点u和它所有的出边,更新入度

4 回到2 迭代计算

如果结果列表的元素个数为n,说明不存在环;输出结果列表,否则输出-1,代表存在环,不存在这样一种排列

代码分析:

1 初始化数据结构

function initEdges(n, edges[maxn])

  for i -> (0, n-1)

    edges[i] = {}

2 邻接表加边

function addEdge(edge[maxn], u, v)

  edges[u].append(v)

3 建图

addEdge(graph, u1, v1, w1)

addEdge(graph, u2, v2, w2)

...

4 统计入度

function calcDegree(n, edges[maxn], deg[maxn])

  for i -> (0, n-1)

    deg[i] = 0

  for i -> (0, n-1)

    for j -> (0, edges[u].size() - 1)

      v = edges[u][i]

      deg[v] = deg[v] + 1

5 拓扑排序

function topoSort(n, edges[maxn], deg[maxn], ans)

  q = Queue()

  for i -> (0, n-1)

    if deg[i] == 0

      q.push(i)

  while(not q.empty())

    u = q.front()

    q.pop()

    ans.append(u)

    for i -> (0, edges[u].size() - 1)

      v = edges[u][i]

      deg[v] = deg[v] - 1

      if deg[v] == 0

        q.push(v)

时间复杂度为o(n+m),n是顶点数量,m为边数量。

代码练习 1 对应蓝桥云课,走多远 代码见下

#include <iostream>
#include <vector>
#include <queue>
using namespace std;#define maxn 1000005void initEdges(int n, vector<int> edges[maxn]){for(int i=0; i<n; ++i){edges[i].clear();}
}void addEdge(vector<int> edges[maxn], int u, int v){edges[u].push_back(v);
}bool topoSort(int n, vector<int> edges[maxn], vector<int>& ans){vector<int> deg;queue<int> q;ans.clear();for(int i=0; i<n; ++i){deg.push_back(0);}for(int i=0; i<n; ++i){for(int j=0; j<edges[i].size(); ++j){int v = edges[i][j];++deg[v];}}for(int i=0; i<n; ++i){if(!deg[i]){q.push(i);}}while(!q.empty()){int u = q.front();q.pop();ans.push_back(u);for(int i=0; i<edges[u].size(); ++i){int v = edges[u][i];--deg[v];if(!deg[v]){q.push(v);}}}return ans.size() == n;
}vector<int> edges[maxn];
int dp[maxn];int main()
{int n, m;cin >> n >> m;while(m--){int u,v;cin >> u >> v;addEdge(edges, u-1, v-1);}vector<int> ans;bool go = topoSort(n, edges, ans);if(go){int ret = 0;for(int i=ans.size() - 1; i>=0; --i){int u = ans[i];dp[u] = 0;for(int j=0; j<edges[u].size(); ++j){int v = edges[u][j];dp[u] = max(dp[v]+1, dp[u]);}ret = max(ret, dp[u]);}cout << ret << endl;}else{cout << 0 << endl;}// 请在此输入您的代码return 0;
}

代码练习2,对应蓝桥云课 阿霖的旅游计划,代码见下

#include <iostream>
#include <vector>
#include <queue>
using namespace std;#define maxn 100005void initEdges(int n, vector<int> edges[maxn]){for(int i=0; i<n; ++i){edges[i].clear();}
}void addEdge(vector<int> edges[maxn], int u, int v){edges[u].push_back(v);
}bool topoSort(int n, vector<int> edges[maxn], vector<int>& ans){vector<int> deg;queue<int> q;ans.clear();for(int i=0; i<n; ++i){deg.push_back(0);}for(int i=0; i<n; ++i){for(int j=0; j<edges[i].size(); ++j){int v = edges[i][j];++deg[v];}}for(int i=0; i<n; ++i){if(!deg[i]){q.push(i);}}while(!q.empty()){int u = q.front();q.pop();ans.push_back(u);for(int i=0; i<edges[u].size(); ++i){int v = edges[u][i];--deg[v];if(!deg[v]){q.push(v);}}}return ans.size() == n;
}vector<int> edges[maxn];
int a[maxn];
long long dp[maxn];int main()
{int n, m;cin >> n >> m;for(int i=0; i<n; ++i){cin >> a[i];}initEdges(n, edges);while(m--){int u, v;cin >> u >> v;--u, --v;if(a[u] < a[v]){addEdge(edges, u, v);}else if(a[v] < a[u]){addEdge(edges, v, u);}}vector<int> ans;long long ret = 0;topoSort(n, edges, ans);for(int i=ans.size() - 1; i>=0; --i){int u = ans[i];long long max = 0;for(int j=0; j<edges[u].size(); ++j){int v = edges[u][j];if(dp[v] > max){max = dp[v];}}dp[u] = max + a[u];if(dp[u] > ret){ret = dp[u];}}cout << ret << endl;// 请在此输入您的代码return 0;
}

代码练习3 对应蓝桥云课 恋爱通关游戏 代码见下

#include <iostream>
#include <vector>
#include <queue>
using namespace std;#define maxn 200005
#define eType vector<int>void initEdges(int n, vector<eType> edges[maxn]){for(int i=0; i<n; ++i){edges[i].clear();}
}void addEdge(vector<eType> edges[maxn], int u, int v, int w){edges[u].push_back({v, w});
}bool topoSort(int n, vector<eType> edges[maxn], vector<int>& ans){vector<int> deg;queue<int> q;ans.clear();for(int i=0; i<n; ++i){deg.push_back(0);}for(int i=0; i<n; ++i){for(int j=0; j<edges[i].size(); ++j){int v = edges[i][j][0];++deg[v];}}for(int i=0; i<n; ++i){if(!deg[i]){q.push(i);}}while(!q.empty()){int u = q.front();q.pop();ans.push_back(u);for(int i=0; i<edges[u].size(); ++i){int v = edges[u][i][0];--deg[v];if(!deg[v]){q.push(v);}}}return ans.size() == n;
}vector<eType> edges[maxn];
long long dp[maxn];int main()
{int n, m;cin >> n >> m;for(int i=0; i<m; ++i){int A, B, C;cin >> A >> B >> C;--A, --B;addEdge(edges, A, B, C);}vector<int> ans;int ret = 0;topoSort(n, edges, ans);dp[0] = 0;for(int i=1; i<n; ++i){dp[i] = -1e9;}for(int i=0; i<ans.size(); ++i){int u = ans[i];for(int j=0; j<edges[u].size(); ++j){int v = edges[u][j][0];int w = edges[u][j][1];dp[v] = max(dp[v], dp[u] + w);     }}for(int i=0; i<n; ++i){if(dp[i] >= 100 && edges[i].empty()){++ret;}}cout << ret << endl;// 请在此输入您的代码return 0;
}

  

http://www.dtcms.com/a/407890.html

相关文章:

  • Ubuntu 24.04.3搭建redis哨兵模式
  • Swift 入门(一 - 基础语法)
  • GCMSCNN 模块:气相色谱 - 质谱数据的分子特征提取方案
  • 简单网页制作模板图片福州seo兼职
  • 新德通:深耕光通信领域,打造全场景网络连接解决方案
  • 汽车网站模板免费下载做网站的注意点
  • COMSOL建立Voronoi泰森多边形二维模型
  • springboot - 邮箱验证码登录
  • 百度收录什么网站京东网站建设的策划书
  • 进程的概念(上)
  • 高仿id97网站模板涞水县建设局网站
  • 网站数据库结构被删了怎么办一键优化为什么不能100
  • 余姚建设网站的公司网站new图标
  • 重庆网站推广流程php5mysql网站开发实例精讲
  • 小型商城网站没技术怎么做网站
  • 网络公司网站模版视频网站做app开发的
  • 北京建站管理系统开发中企动力中山分公司网站
  • 手机端企业网站模板网页怎么设计与制作
  • 代码随想录算法训练营第21天 -- 回溯4 || 491.非递减子序列 / 46.全排列 /47.全排列 II
  • 绍兴公司网站建设 中企动力绍兴wordpress edc
  • 怎么找到做网站的客户岳阳网站建设团队
  • Android匿名共享内存突破Binder传递大小限制
  • 网络网站推广首荐乐云seowordpress关键字内链
  • 元气森林宇宙大赛——第五届高校创新挑战赛
  • 51的烧录与调试
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘tokenizers’ 问题
  • 数字门店的未来蓝图:从水果店到餐厅再到超市
  • 做动态图片下载哪个网站好百度高级搜索网址
  • Mnn模型转换
  • 在Windows中通过网络共享文件