拓撲排序模板
阿新 • • 發佈:2018-12-10
#include<iostream> #include<cstdio> #include<queue> #include<vector> #include<algorithm> #include<cmath> using namespace std; vector<int> G[1005];//STL大法存圖。 queue<int> q;//q陣列每次存的是當前所有入讀為0的點。 int in[1005];//in數維護的是當前所有點的入度。 int main() { int n,m; cin>>n>>m;//n個點,m條邊. for(register int i=0;i<m;++i) { int x,y; cin>>x>>y; G[x].push_back(y);//表示x到y有一條邊。 in[y]++;//y點的入度+1. } for(register int i=1;i<=n;++i) if(!in[i])q.push(i);//第一遍查詢所有入度為0的點。 while(!q.empty()) { int now=q.front(); cout<<now<<" ";//輸出當前入度為0的點。 q.pop(); for(register int i=0;i<G[now].size();++i) { int v=G[now][i];//now到v有一條邊。 in[v]--;//把這條邊刪掉,相當於把v的入度-1。 if(!in[v])//如果當前v點的入度已經為0了,那麼把v加入到q中。 q.push(v); } } }
#include<iostream> #include<cstdio> #include<queue> #include<vector> #include<algorithm> #include<cmath> using namespace std; vector<int> G[1005]; queue<int> q; int in[1005]; int main() { int n,m; cin>>n>>m; for(register int i=0;i<m;++i) { int x,y; cin>>x>>y; G[x].push_back(y); in[y]++; } for(register int i=1;i<=n;++i) if(!in[i])q.push(i); while(!q.empty()) { int now=q.front(); cout<<now<<" "; q.pop(); for(register int i=0;i<G[now].size();++i) { int v=G[now][i]; in[v]--; if(!in[v]) q.push(v); } } }