把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

【模板】拓扑排序

之前写题要用板子的时候去挖坟
【图论】拓扑排序&判环
发现我居然没有存板子
就完善一下吧 把代码搞出来 顺便复习一下

void tp()
{
	for(int i=1;i<=n;i++)
		if(ind[i]==0)
			Q.push(i);
	while(!Q.empty())
	{
		int u=Q.front();
		Q.pop();
		ans[++cnt]=u;
		for(int i=0;i<G[u].size();i++)
		{
			int v=G[u][i];
			ind[v]--;
			if(ind[v]==0)
				Q.push(v);
		}
	}
}

然后再把 c n t cnt cnt和顶点数 n n n进行比较 如果 c n t &lt; n cnt&lt;n cnt<n就说明有环

但是呢 要注意有时候图不是一个联通块的情况

搞了一道小水题
http://codevs.cn/problem/2833/

#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<string>
#include<queue>
#include<algorithm>
using namespace std;
#define MAXN 10005
#define LL long long
int n,m,ind[MAXN],cnt;
vector<int>G[MAXN];
queue<int>Q;
void tp()
{
	for(int i=1;i<=n;i++)
		if(ind[i]==0)
			Q.push(i);
	while(!Q.empty())
	{
		int u=Q.front();
		Q.pop();
		cnt++;
		for(int i=0;i<G[u].size();i++)
		{
			int v=G[u][i];
			ind[v]--;
			if(ind[v]==0)
				Q.push(v);
		}
	}
}
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++)
    {
    	int u,v;
    	scanf("%d %d",&u,&v);
    	G[u].push_back(v);
    	ind[v]++;
	}
	tp();
	if(cnt>=n)
    	printf("o(∩_∩)o");
    else
    	printf("T_T\n%d\n",n-cnt);
    return 0;
}
posted @   Starlight_Glimmer  阅读(9)  评论(0编辑  收藏  举报  
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示