拓扑排序

在这里插入图片描述

输入a和b,a的vector数组里添加b,且b的进度加1,输入结束后,遍历map看哪一个的进度为0则为进栈,然后若栈不为空则继续循环和弹出,比如a进度为0则出栈,然后a中的vector数组中的每一个节点的进度减一,在判断这些节点的进度是否为0,若是则进栈。

#include <iostream>
#include <map>
#include <string>
#include <stack>
#include <vector>
using namespace std ;
struct node {
    int in ;
    vector<string> to ;
};
map<string,node> p ;
map<string,int> vis ; //0表示没有访问过,1表示已经访问过,-1表示正在访问;
stack<string> s ;
int main(){
    int t , n ;
    string a , b ;
    cin >> t ;
    while(t--){
        cin >> n ;
        for (int i = 0 ; i < n ; i ++){
            cin >> a >> b  ;
            if (vis[a] == 0){
                vis[a] = 1 ;
                p[a].in = 0 ;
            }
            p[a].to.push_back(b) ;
            if (vis[b] == 0){
                vis[b] = 1 ;
                p[b].in = 0 ;
            }
            p[b].in ++ ;
        }
        map<string,node>::iterator it ;
        for (it = p.begin() ; it != p.end() ; it ++){
            if ((*it).second.in == 0)
                s.push((*it).first);
        }
        bool flag = true ;
        while(!s.empty()){
            string str = s.top() ;
            if (flag){
                cout << str ;    flag = false ;
            }
            else
                cout << " " << str ;
            s.pop() ;
            if (!p[str].to.empty()){
                for (int j = 0 ; j < p[str].to.size() ; j ++){
                    string ss = p[str].to[j] ;
                    p[ss].in -- ;
                    if (p[ss].in == 0){    //若进度为0则进栈
                        s.push(ss);
                    }
                }
            }
        }
        cout << endl;
        p.clear() ;
        vis.clear() ;
    }
    return 0 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值