很裸的一道topo_sort题目,题目说,每组数据都会至少有一中排序,所以就不用考虑其它问题了。在这回顾下naive拓扑排序吧。
1.存储节点间的关系;
2.记录每个节点的入度;
3.循环N次,每次得到一个输出,每次循环里都要寻找入度为零的点,并且把它对应的节点的入度减一;
4.直到没有入度为零的点,则结束。
#include <iostream> #include <fstream> using namespace std; #define MAXN 105 bool adj[MAXN][MAXN]; int in_degree[MAXN]; int n; int result[MAXN]; char str[MAXN]; void topo_sort() { int i,j,k; memset(in_degree,0,sizeof(in_degree)); for(i=1; i<=n; i++) //寻找入度为零的节点 { for(j=1; j<=n; j++) { if(adj[i][j]) in_degree[j]++; } } for(i=1; i<=n; i++) { for(j=1; j<=n; j++) { if(in_degree[j]==0) { k=j; break; } } in_degree[k]=-1; result[i]=k; for(j=1; j<=n; j++) //入度减一 { if(adj[k][j]) { in_degree[j]--; } } } } int main() { int i,tem; memset(adj,false,sizeof(adj)); freopen("acm.txt","r",stdin); scanf("%d",&n); for(i=1; i<=n; i++) { while(scanf("%d",&tem),tem) { adj[i][tem]=true; } } topo_sort(); for(i=1; i<=n; i++) { if(i==1) printf("%d",result[i]); else printf(" %d",result[i]); } printf("\n"); return 0; }