版权声明:未经本人同意,禁止转载。 https://blog.csdn.net/qq_34022601/article/details/84311976
经典拓扑排序题目;
TopSort 思路:https://blog.csdn.net/qq_34022601/article/details/84303726
#include <cstdio>
#include <algorithm>
#include <map>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
struct Node{
vector <int> arc;
};
int topnum[10010]; //存储Top排序的序列
int indegree[10010];//入度数量
void Topsort(Node *G,int n)
{
queue <int> q;
int v,counter=0;
for (int i=1;i<=n;i++)
{
if (indegree[i]==0)
{
q.push(i);
}
}
vector <int> :: iterator it;
while (!q.empty())
{
v=q.front();
q.pop();
topnum[++counter]=v;
for (it=G[v].arc.begin();it!=G[v].arc.end();it++)
{
indegree[*it]--;
if (indegree[*it]==0)
q.push(*it);
}
}
for (int i=1;i<=n;i++)
{
printf ("%d",topnum[i]);
if (i!=n)
printf (" ");
}
printf ("\n");
}
int main()
{
int n,m,x,y;
while (~scanf ("%d %d",&n,&m) &&( n + m)) //注意n+m!=0
{
Node G[10010];
map <pair<int,int>,int> mp;
pair<int ,int > p;
for (int i=0;i<m;i++)
{
scanf ("%d %d",&x,&y);
p.first=x;p.second=y;
if (mp[p]==0)//防止重复输入,使入度增加
{
G[x].arc.push_back(y);
indegree[y]++;
mp[p]++;
}
}
Topsort(G,n);
memset(topnum,0,sizeof(topnum));
memset(indegree,0,sizeof(indegree));
}
return 0;
}