裸拓扑排序
#include<bits/stdc++.h>
#define maxn 517
using namespace std;
int G[maxn][maxn];//路径
int in_degree[maxn]; //入度
int ans[maxn];
int n,m;
void toposort(){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(G[i][j]){
in_degree[j]++;
}
}
}
for(int i = 1; i <= n; i++)
{
int k=1;
while(in_degree[k]!=0){
k++;
}
ans[i]=k;
in_degree[k]=-1;
for(int j = 1; j <= n; j++){
if(G[k][j])
in_degree[j]--;
}
}
}
void init(){
memset(in_degree,0,sizeof(in_degree));
memset(ans,0,sizeof(ans));
memset(G,0,sizeof(G));
}
int main()
{
while (~scanf("%d%d",&n,&m))
{
init();
for(int i = 0; i < m; i++ )
{
int x,y;
cin>>x>>y;
if(G[x][y]) continue;
G[x][y]=1;
}
toposort();
for(int i = 1; i < n; i++){
cout<<ans[i]<<" ";
}
cout<<ans[n]<<endl;
}
}
拓扑+优先队列
#include<bits/stdc++.h>
#define maxn 517
using namespace std;
bool G[maxn][maxn];
int in_degree[maxn];
int n,m;
priority_queue<int,vector<int>,greater<int> > q;
void toposort(){
for(int i = 1;i <=n; i++){
if(in_degree[i]==0) q.push(i);
}
int c = 1;
while(!q.empty())
{
int v=q.top();
q.pop();
if(c != n){
cout<<v<<" ";
c++;
}
else {
cout<<v<<endl;
}
for(int i = 1; i <= n; i++){
if(!G[v][i]){
continue;
}
in_degree[i]--;
if(!in_degree[i])
q.push(i);
}
}
}
void init(){
memset(G,0,sizeof(G));
memset(in_degree,0,sizeof(in_degree));
}
int main(){
while(cin>>n>>m){
int k = 0;
init();
while(m--){
int x,y;
cin>>x>>y;
if(G[x][y]){
continue;
}
G[x][y]=1;
in_degree[y]++;
}
toposort();
}
}