网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=117863#problem/B
思路分析:裸的拓扑排序,注释在代码中。
代码:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <queue> #include <stack> #include <vector> using namespace std; const int maxn=110; vector<int> tp[maxn];//用来储存依赖关系 int b[maxn];//储存依赖度 queue<int> q,ans;//q队列用来储存入度为0的元素,ans队列用来储存顺序 int m,n; int main() { int x,y; while(scanf("%d%d",&n,&m)&&(n||m)) { memset(b,0,sizeof(b)); for(int i=1;i<=n;i++) tp[i].clear();//初始化!!! for(int i=0;i<m;i++) { scanf("%d%d",&x,&y); tp[x].push_back(y);//记录依赖关系。 b[y]++;//记录y元素依赖度 } for(int i=1;i<=n;i++) if(!b[i]) q.push(i);//将入度为0的元素压入队列 while(!q.empty())//开始剪边 { int t=q.front(); ans.push(t); q.pop(); for(int i=0;i<tp[t].size();i++) { b[tp[t][i]]--;//依赖度--; if(b[tp[t][i]]==0)//入度为0 q.push(tp[t][i]); } } while(!ans.empty()) { if(ans.size()>1) printf("%d ",ans.front()); else printf("%d ",ans.front()); ans.pop(); } } return 0; }