1 一道bfs,唯一不同的是要对单链表中后继节点的编号排序
#include<bits/stdc++.h>
using namespace std;const int N=10000;vector<int> headofNode[N];
int n,m;
int d;
bool st[N];
int parent[N];
vector<int> ans;void PrintAns(int i){//cout<<"PrintAns"<<endl;for(int j=i;j!=0;j=parent[j]){//cout<<j<<" ";ans.push_back(j);}ans.push_back(0);for(int k=ans.size()-1;k>0;k--){cout<<ans[k]<<"->";}cout<<ans[0];
}void bfs(){queue<int> q;q.push(0);bool isFind=false;while(!q.empty()){int t=q.front();q.pop();for(long unsigned int i=0;i<headofNode[t].size();i++){//cout<<"Nodeid"<<e[i]<<" "<<endl;int nodeid=headofNode[t][i];if(!st[nodeid]){q.push(nodeid);}if(headofNode[nodeid].size()==0&&!st[nodeid]){isFind=true;PrintAns(nodeid);break;}}if(isFind)break;}if(!isFind)cout<<"NULL";
}int main(){cin>>n;cin>>m;while(m--){int x,y;cin>>x>>y;headofNode[x].push_back(y);parent[y]=x;}//cout<<parent[1]<<endl;cin>>d;for(int i=0;i<d;i++){int x;cin>>x;st[x]=true;}for(int i=0;i<N;i++){if(headofNode[i].size()>1){sort(headofNode[i].begin(),headofNode[i].end());}}bfs();
}
2 一道bfs拓扑排序,但是记录了每个点的遍历层数
#include<bits/stdc++.h>
using namespace std;vector<int> e[10005];
int d[10005], dp[10005]; int main() {int n;cin >> n;for (int i = 1; i <= n; i++) {int m; cin >> m;for (int j = 1; j <= m; j++) {int x;cin >> x; e[x].push_back(i); d[i]++; }}queue<int> q;for (int i = 1; i <= n; i++) {if (d[i] == 0) {q.push(i); dp[i] = 1; }}while (!q.empty()) {int u = q.front(); q.pop(); for (auto v : e[u]) {dp[v] = max(dp[v], dp[u] + 1); d[v]--; if (d[v] == 0) { q.push(v); }}}int mx = 0;for (int i = 1; i <= n; i++) {if (dp[i] == 0) { cout << -1 << endl; return 0;}mx = max(mx, dp[i]); }cout << mx << endl;return 0;
}