【拓扑排序模板题DFS方法】UVA - 10305 Ordering Tasks

16 篇文章 0 订阅
4 篇文章 0 订阅

Problem Description

给你n个点,还有m个关系,让你输出拓扑排序后的结果

代码:因为之前学习过拓扑排序,用之前的方法很轻松的A了,后面看到dfs解决的就去学习学习,还看了挺久的才看懂。。

#include<bits/stdc++.h>
using namespace std;
int n, m, t;
int Map[105][105], Pre[105], vis[105];
bool dfs(int u)
{
    vis[u] = -1;
    for(int v = 1; v <= n; v++)
        if(Map[u][v]) {//代表能走
            if(vis[v] < 0) return false;//走回了原来的点,回路返回0
            else if(!vis[v] && !dfs(v))//找没有走过的点,继续dfs
                return false;}
    //没有回路,记录下最深的点,也就是入度最多的点。
    vis[u] = 1;//标记已经走过
    Pre[t--] = u;//倒着存入点,一会儿顺着输出就好了
    return true;
}
bool toposort()
{
    t = n;
    memset(vis, 0, sizeof(vis));
    for(int u = 1; u <= n; u++)
        if(!vis[u])//如果没有走过,就走一走
            if(!dfs(u)) return false;//dfs,如果返回0,代表有回路,所以返回0
        return true;
}
int main()
{
    int u, v;
    while(~scanf("%d %d", &n, &m))
    {
        memset(Map, 0, sizeof(Map));
        if(!n && !m) break;//都是0退出循环
        while(m--)
        {
            scanf("%d %d", &u, &v);
            Map[u][v] = 1;//关系用图存起来起来(标记起来)
        }
        if(toposort()){//拓扑排序
        for(int i = 1; i <= n; i++)//输出
        {
            printf("%d ", Pre[i]);
        }
        printf("\n");}
        else printf("0\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值