• 拓扑排序模板


    bool dfs(int u)
    {
    	vis[u] = -1;
    	REP(i, 0, g[u].size())
    	{
    		int v = g[u][i];
    		if(vis[v] == -1) return false;
    		else if(!vis[v]) dfs(v); 
    	}	
    	vis[u] = 1; ans[--t] = u; //注意这里倒序加入
    	return true;
    }
    
    bool toposort() //可以用来判断有向图是否有环return false 则有环
    {
    	t = n;
    	memset(vis, 0, sizeof(vis));
    	REP(i, 0, n)
    		if(!vis[i] && !dfs(i))
    			return false;
    	return true;
    }


    裸题:UVa 10305

    #include<cstdio>
    #include<vector>
    #include<cstring>
    #define REP(i, a, b) for(int i = (a); i < (b); i++)
    using namespace std;
    
    const int MAXN = 1123;
    vector<int> g[MAXN];
    int vis[MAXN], ans[MAXN], n, m, t;
    
    bool dfs(int u)
    {
    	vis[u] = -1;
    	REP(i, 0, g[u].size())
    	{
    		int v = g[u][i];
    		if(vis[v] == -1) return false;
    		else if(!vis[v]) dfs(v); 
    	}	
    	vis[u] = 1; ans[--t] = u;
    	return true;
    }
    
    bool toposort()
    {
    	t = n;
    	memset(vis, 0, sizeof(vis));
    	REP(i, 0, n)
    		if(!vis[i] && !dfs(i))
    			return false;
    	return true;
    }
    
    int main()
    {
    	while(~scanf("%d%d", &n, &m) && n)
    	{
    		REP(i, 0, n) g[i].clear();
    		while(m--)
    		{
    			int u, v;
    			scanf("%d%d", &u, &v);
    			u--; v--;
    			g[u].push_back(v);
    		}
    		
    		if(toposort())
    		{
    			REP(i, 0, n - 1) printf("%d ", ans[i] + 1);
    			printf("%d
    ", ans[n - 1] + 1);
    		}
    		else puts("NO");
    	}
    	
    	return 0;	
    } 
  • 相关阅读:
    BZOJ 1098[POI2007]办公楼
    BZOJ 3629[JLOI2014]聪明的燕姿
    BZOJ 1064[NOI2008]假面舞会
    BZOJ 2818GCD
    【五校联考6day2】san
    【五校联考6day2】er
    【五校联考6day2】yi
    【五校联考3day2】B
    【五校联考5day1】序列
    【五校联考3day2】A
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819527.html
Copyright © 2020-2023  润新知