1. 程式人生 > >poj 2367拓撲排序

poj 2367拓撲排序

Source Code

Memory: 276K Time: 16MS
Language: C++ Result: Accepted
  • Source Code
    #include"iostream"
    #include"stack"
    #include"vector"
    #include"cstdio"
    using namespace std;
    vector< vector<int> > G;//採用鄰接表儲存圖
    vector<int> degree;     //度數表
    vector<int> is_in_stack;//判斷是否入過棧
    vector<int
    > ans; //儲存答案 int n,m; //點數 弧數 int topo_sort(){ stack<int> st; for(int i=1;i<=n;i++){ //先找到入度為0的點 壓入棧中 if(degree[i]==0){ st.push(i); is_in_stack[i] = 1; //更新點的標誌 } } while(!st.empty()){ int now = st.top();st.pop
    (); ans.push_back(now); for(int i=0;i<G[now].size();i++){//把鄰接的點的度數更新 degree[G[now][i]]--; } for(int i=1;i<=n;i++){ if(degree[i]==0&&!is_in_stack[i]){//把更新之後的圖中入度為0的點入棧 st.push(i); is_in_stack[i]=1; }
    } } } int main(){ while(cin>>n){ G.resize(n+1); is_in_stack.resize(n+1); degree.resize(n+1); for(int i=1;i<=n;i++){ int ed; while(scanf("%d",&ed)&&ed){ G[i].push_back(ed); } } for(int i=1;i<=n;i++){ is_in_stack[i]=0; for(int j=0;j<G[i].size();j++){ degree[G[i][j]]++; } } topo_sort(); int first = 1; for(int i=0;i<ans.size();i++){ if(first) {first = 0;cout<<ans[i];} //else cout<<"--->"<<ans[i]; else cout<<" "<<ans[i]; } cout<<endl; } return 0; }