题目(http://acm.hdu.edu.cn/showproblem.php?pid=1285)
第一次做拓扑排序,照着网上的模板来敲得。
#include <iostream>
#include <string.h>
using namespace std;
const int maxn=501;
int map[maxn][maxn]; //存储图的临界阵
int indegree[maxn];//存储点的入度
int main()
{int m,n;
int a,b;
while(cin>>n>>m)
{
memset(map,0,sizeof(map));
memset(indegree,0,sizeof(indegree));
for(int i=0;i<m;i++)
{
cin>>a>>b;
if(!map[a][b])//此处别忘了重边的判断,否则会wa
{
map[a][b]=1;
indegree[b]++; //重边的时候,如果不做处理,度数为计算错误
}
}
for(int i=1;i<n+1;i++)//进行n次遍历,每次找出一个入度为0的节点
{
for(int j=1;j<n+1;j++)//遍历所有节点
{
if(indegree[j]==0)//找出入度为0的节点
{
indegree[j]--;//度数递减,避免下次继续找到
if(i!=n)
cout<<j<<" ";
else
cout<<j<<endl;
for(int k=1;k<n+1;k++) // 删除与度数为0的节点相关联的边
{
if(map[j][k]==1)
indegree[k]--;
}
break;
}
}
}
}
return 0;
}