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

有向图的拓扑序列

848. 有向图的拓扑序列 - AcWing题库

 昨天看了这道题L3-031 千手观音 拓扑排序+哈希表_他不是混子QAQ的博客-CSDN博客

就想着也用这道题的stl方法来试下

先来我的这个笨笨的方法,就当练习stl了,后面还有一个简便的stl

STL知识点(刚知道:

对于vector中是否有tmp这个元素 : count(v.begin(),v.end(),tmp)  

而对于map : m.count(tmp) 

还有一个就是 for (auto &[k,v] : d) 的使用 (见方法1)

 拓扑排序:

记录入度,先将入度为0的点放入队列,将队列的点依次出列,找出这个点发出的边,删除边,更新点的入度,再将入度为零的点入队,依次循环,直到队列空。如果存在拓扑排序,则存入了n个点,少于n个则不存在拓扑排序。

用队列来实现,如果要字典序输出的话,那么就优先队列实现

#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
int n, m;

unordered_map<string, vector<string>> g;//邻接表
unordered_map<string, int>d;//入度
queue<string> q;
int main()
{
	cin >> n >> m;
	while (m--)
	{
		string a, b;
		cin >> a >> b;
		if (!count(g[a].begin(), g[a].end(), b))//防止重复的边增加入度
		{
			g[a].push_back(b);
			d[b]++;
		}
		if (!d.count(a)) d[a] = 0;
        //这行很有必要,因为是map<string,string> 无这行d[a]就存不了
	}

	vector<string> res;
	for (auto &[k,v] : d)//先找到入度为0的点,存入队列中去
		if (v == 0) q.push(k);
	while (q.size())
	{
		string s = q.front();
		res.push_back(s);
		q.pop();
		for (auto& u : g[s])
			if (--d[u] == 0)
				q.push(u);

	}
	if (res.size() < n)
	{
		cout << -1 << endl;
		return 0;
	}
	else
	{
		for (auto x : res)
			cout << x << " ";
	}

	system("pause");
}

 因为这题给的是int类型的,直接用vector<int>g[N]存邻接表就好了

下面的这个就显得很简洁了,但是上面的代码可以来存字符串的情况(毕竟是千手观音那道题过来的)。

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, m;
vector<int> g[N];
int d[N];
queue<int> q;
int main()
{
	cin >> n >> m;
	while (m--)
	{
		int a, b;
		cin >> a >> b;
		g[a].push_back(b);
		d[b]++;//显现出和map的区别了,这里全局变量自动为0,而map得判断下
	}
	for (int i = 1;i <= n;i++)
		if (!d[i]) q.push(i);
	
	vector<int> res;

	while (q.size())
	{
		int u = q.front();
		q.pop();
		res.push_back(u);
		for (auto x : g[u])
			if (--d[x] == 0) 
				q.push(x);
	}
	if(res.size()<n)
	{
		cout <<-1<< endl;
		return 0;
	}
	for (auto x : res) 
		cout << x << " ";
	
}

数组模拟队列的代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, m;
int h[N], e[N], ne[N], idx;
int q[N],d[N];

void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

bool topsort()
{
	int hh = 0, tt = -1;

	for (int i = 1;i <= n;i++)
		if (!d[i]) q[++tt] = i;

	while (hh <= tt)
	{
		int t = q[hh++];
		for (int i = h[t];i != -1;i = ne[i])
		{
			int j = e[i];
			if (--d[j] == 0)
				q[++tt] = j;
		}
	}
	return tt == n - 1;
}
int main()
{
	cin >> n >> m;
	memset(h, -1, sizeof h);
	while (m--)
	{
		int a, b;
		cin >> a >> b;
		add(a, b);
		d[b]++;
	}
	if (!topsort()) cout << -1;
	else
		for (int i = 0;i < n;i++) cout << q[i] << " ";
}

 

相关文章:

  • 防御 CSS 黑客——介绍“安全的 CSS hacks”
  • 通信原理与MATLAB(九):DPSK的调制解调
  • Docker安装配置运行Redis
  • 2022 年上海市大学生程序设计竞赛 M. My University Is Better Than Yours
  • 数据结构(陈越、何钦铭)学习笔记
  • pytorch集锦(2)-处理数据DataLoader和Dataset(2)
  • Ant Design入门
  • 网络请求回调的实现方式
  • STM32 使用IQmath实现SVPWM 正弦波无刷电机控制
  • Openstack的安装部署教程
  • 密码学_AES加密算法
  • 个人博客系统(前后端分离)
  • Linux常用基本指令详解
  • Linux c编程之静态库与动态库
  • 【消息中间件】RocketMQ如何实现Producer的负载均衡
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Docker 笔记(2):Dockerfile
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • isset在php5.6-和php7.0+的一些差异
  • Laravel 中的一个后期静态绑定
  • node.js
  • nodejs:开发并发布一个nodejs包
  • Python socket服务器端、客户端传送信息
  • use Google search engine
  • vue中实现单选
  • 产品三维模型在线预览
  • 马上搞懂 GeoJSON
  • 深度学习中的信息论知识详解
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 我感觉这是史上最牛的防sql注入方法类
  • 想写好前端,先练好内功
  • hi-nginx-1.3.4编译安装
  • zabbix3.2监控linux磁盘IO
  • 移动端高清、多屏适配方案
  • $L^p$ 调和函数恒为零
  • (vue)页面文件上传获取:action地址
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (函数)颠倒字符串顺序(C语言)
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (数据结构)顺序表的定义
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)创业家杂志:UCWEB天使第一步
  • (轉)JSON.stringify 语法实例讲解
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .gitignore文件_Git:.gitignore
  • .Net Winform开发笔记(一)
  • .net 简单实现MD5
  • .net 设置默认首页
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET是什么
  • /dev/sda2 is mounted; will not make a filesystem here!