http://acm.hdu.edu.cn/showproblem.php?pid=1285
这里用到了网上找的的拓扑排序的模版。
map[i][j]存放有向图的起点i和终点j之间是否连线,=1连线,=0为空。
结果的顺序存放在res数组里面。
d[i]表示第i个元素的入度,
1)入度为零即表示可以读;
2)有多个入度为零的点则最终顺序不唯一;
3)不存在入度为零的点则顺序不能确定。
这道题不用考虑有环的情况。
#include <iostream>
using namespace std;
#define MAX 510
int map[MAX][MAX]; //图
int res[MAX]; // 存放结果
int TopSort(int n,int mat[MAX][MAX],int* res)
{
int d[MAX],i,j,k;
for (i=0;i<n;i++)
for (d[i]=j=0;j<n;d[i]+=mat[j++][i]);
for (k=0;k<n;res[k++]=i)
{
for (i=0;d[i]&&i<n;i++);
if (i==n)
return 0;
for (d[i]=-1,j=0;j<n;j++)
d[j]-=mat[i][j];
}
return 1;
}
int main(){
int N,M;
int a,b;
while(cin>>N>>M){
if(N==0&&M==0) break;
memset(map,0,sizeof(map));
for(int i=0;i<M;i++){
cin>>a>>b;
map[a-1][b-1]=1;
}
TopSort(N,map,res);
for(int i=0;i<N;i++){
cout<<res[i]+1;
if(i!=N-1) cout<<" ";
}
cout<<endl;
}
}