Website: Http://acm.hust.edu.cn/vjudge/contest/view.action?cid=117863#problem/B
Thought analysis: The bare topological sort, comments in the code.
Code:
#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];//used to store dependencies
int b[maxn];//Storage Dependency Degree
Queue<int> q,ans;//q queue is used to store elements in the 0, ans queue is used to store order
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 ();//Initialize!!!
for (int i=0;i<m;i++)
{
scanf ("%d%d", &x,&y);
Tp[x].push_back (y);//Record dependencies.
b[y]++;//Record Y element dependency
}
for (int i=1;i<=n;i++)
if (!b[i]) Q.push (i);//press the element into the queue with a degree of 0
while (!q.empty ())//Start Trimming
{
int T=q.front ();
Ans.push (t);
Q.pop ();
for (int i=0;i<tp[t].size (); i++)
{
b[tp[t][i]]--;//dependence degree-;
if (b[tp[t][i]]==0)//In the degree of 0
Q.push (Tp[t][i]);
}
}
while (!ans.empty ())
{
if (Ans.size () >1) printf ("%d", Ans.front ());
else printf ("%d\n", Ans.front ());
Ans.pop ();
}
}
return 0;
}
UVA10305 topology Ordering