输入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 ;
}