C++拓扑排序

安利一篇比较写的比较好的的博客...

拓扑排序的原理及其实现

我本来以为我看懂了原理就会打了,没想到因为没有手动实践过...原理实际上也没记清楚....

一题HDU的拓扑裸题HDU 3342

我的拓扑排序是直接用栈实现的....手动模拟链表玩栈简直....我看博文也看了一会才看懂...不过有STL在打题的时候明显提高代码效率丫...

#include<iostream>
#include<vector>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
vector<int>head[105];
int M,N;
int d[105];
bool toposort()
{
	stack<int>sta;
	bool vis[105] = {false};
	for (int i = 0; i < N; i++)//入度为0 
	{
		if (!vis[i] && d[i] == 0)
		{
			vis[i] = true;
			sta.push(i);
		}
	}
	while(!sta.empty())
	{


		int nod = sta.top();
		sta.pop();

		for(int i = 0; i < head[nod].size(); i++)
		{
			int u = head[nod][i];//将前驱为0的节点,对应的边去掉,对应点的入度减一 
			d[u]--;
		}
		for (int i = 0; i < N; i++)
		{
			if (!vis[i] && d[i] == 0)
			{
				vis[i] = true;
				sta.push(i);
			}
		}
	}
	for(int i = 0; i < N; i++)//查看是否有回路 
	{
		if(!vis[i]) return false;
	}
	return true;
}
int main()
{
	while(scanf("%d %d",&N,&M),M||N)
	{
		memset(d,0,sizeof(d));
		for(int i = 0; i < N+1; i++) head[i].clear();

		for(int i = 0; i < M; i++)
		{
			int a,b;
			scanf("%d %d",&a,&b);
			d[b]++;
			head[a].push_back(b);
		}
		if(toposort()) printf("YES\n");
		else printf("NO\n");
	}
}
posted @ 2016-06-06 23:43  洛丶航  阅读(1008)  评论(0编辑  收藏  举报