【模板】拓扑排序

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

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 < n cnt<n cnt<n就说明有环

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

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

#include
#include
#include
#include
#include
#include
#include
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;
}

你可能感兴趣的:(模板)