• UVA


    /*
      初次接触拓扑排序,查找并看过的资料链接,罗列一下:
      http://www.cnblogs.com/luruiyuan/p/5509523.html
      
      
      这题有一个很容易WA的点:
      本题应该是 m、n同时为0时,才结束输入的循环;而不是我们通常认为的,只要有一个0就结束循环了...这个问题很容易WA
      
    */


    #include <iostream>
    #include <stack>
    #include <cstring>
    using namespace std;
    const int maxn = 100 + 5;
    int vis[maxn]; //访问标志,为 0 表示从来没有访问过;为 1表示已经访问过,并且还递归访问过它的所有子孙 (即 dfs(u) 已被调用过,并已返回) ;为 -1 表示正在访问,(即 dfs(u) 正在栈帧中,尚未返回) 
    int topo[maxn], t;
    int g[maxn][maxn], u, v, n, m;
    stack<int> s;
    
    void dfs(int u) //可以用 DFS 求出有向无环图 (DAG) 的拓扑排序。如果排序失败,说明该有向图存在有向环,不是 DAG 
    {
    	vis[u] = -1; // visting
    	for (int i = 1; i <= n; i++)
    	if (g[u][i] && !vis[i])
    	dfs(i);
    	s.push(u);
    //	cout << "I'm pushing " << u << " now." << endl;
    	vis[u] = 1; //visited
    }
    
    int main()
    {
    	while (cin >> n >> m)
    	{
    		if (!n && !m) break;
    		
    		memset(g, 0, sizeof(g));
    		memset(vis, 0, sizeof(vis)); //初始化 
    		
    		while (m--)
    		{
    			cin >> u >> v;
    			g[u][v] = 1;
    		} //输入,完成有向图的初始化 
    		
    		for (int i = 1; i <= n; i++)
    		if (!vis[i]) dfs(i); //拓扑排序
    		
    		while (!s.empty())
    		{
    			cout << s.top();
    			s.pop();
    			cout << (s.empty() ? '
    ' : ' ');
    		 } 
    	}
    	return 0;
    }


  • 相关阅读:
    实验四 代码评审
    实验三、UML 建模工具的安装与使用
    结对编程 第二阶段
    结对编程第一阶段
    实验一 GIT代码版本管理
    实验五 单元测试
    实验四 代码评审
    实验三 UML 建模工具的安装与使用
    结对编程阶段二
    结对编程第一阶段
  • 原文地址:https://www.cnblogs.com/mofushaohua/p/7789394.html
Copyright © 2020-2023  润新知