Ordering Tasks-简单的拓扑排序

来源:互联网 发布:微信js sdk 编辑:程序博客网 时间:2024/06/05 18:18

原题在这里^_^

题意:通过输入m条两任务间的优先顺序,输出一个可能的任务顺序;

思路;拓扑排序,就是建立一个图,每次选择入度为零的顶点,将与之关联的点的入度减一。

拓扑的关键两步骤:

1.入度为零的顶点输出;

2.将该点连得边去掉。(即与之关联点的入度减一)

#include<iostream>#include<cstring>#include<stack>using namespace std;const int maxn=101;int Adj[maxn][maxn], inDegree[maxn], n, m;stack<int> stk;void CreatGraph(){memset(Adj, 0, sizeof(Adj));memset(inDegree, 0, sizeof(inDegree));int u, v;while(m--){cin>>u>>v;Adj[u][v]=1;inDegree[v]++;}for(int i=1; i<=n; i++)//将入度为零的点入栈。if(inDegree[i]==0)stk.push(i);return;}void tpSort(){int order[n];//输出的顺序int it, cnt=0;while(stk.size())//栈不为空就说明还有入度为零的点未输出。{it=stk.top();stk.pop();for(int i=1; i<=n; i++){if(Adj[it][i] && inDegree[i])inDegree[i]--;if(Adj[it][i] && !inDegree[i])//入度为零则进栈。stk.push(i);}order[cnt++]=it;//将该点存入序列。}for(int i=0; i<n-1; i++)cout<<order[i]<<" ";cout<<order[n-1]<<endl;return;}int main(){while(cin>>n>>m && n+m){CreatGraph();tpSort();}return 0;} 




原创粉丝点击