C/C++之拓扑排序

确定节点之间的关系,输出拓扑排序的结果

#include
using namespace std;
int n=4;
string r[]={"a","b","c","d"};//每个点的名字 
int graph[][4]={{0,1,0,0},{0,0,0,0},{0,1,0,0},{0,0,1,0}};//有向图 
int vis[4];//是否被访问 
int topo[4];//名字的下标 
int t=n; 
bool dfs(int i)
{
	vis[i]=-1;//判断是否有环,避免无法解决,因为在(2)处有判断,有环的话会死掉,但是加了之后直接跳过,既可以避免死循环,也可以判断是否有环
	for(int j=0;j<n;j++)//遍历以当前节点为起点的所有边 
	{
		if(graph[i][j]>0)
		{
			if(vis[j]==0&&dfs(j)==false)//(2)
				return false;
		}
	}
	topo[--t]=i;
	vis[i]=1;
	return true;
}
int main()
{
	for(int i=0;i<n;i++)
	{
		if(vis[i]==1)//如果被访问,继续 
			continue;
		bool b=dfs(i);//当前节点没有被访问,遍历以当前节点为起点的所有边 
		if(!b)
		{
			cout<<false<<endl;
			return 0;
		}
	}
	for(int i=0;i<n;i++)
	{
		cout<<r[topo[i]]; 
	}
}

主要的原则就是一次遍历每一个节点,如果当前节点没有被访问,就遍历所有以当前节点为起点的边,如果遍历的边已经被访问则继续,如果没有被访问,则以尾节点为起点继续进行遍历,直至所有的起点都被访问。

你可能感兴趣的:(c/c++)