标准的拓扑排序,用邻接表来存储
邻接表的下标表示节点序号,邻接表内容包括两个部分,一个是该节点的前驱数目,一个是后继链表(存放其所有后继的链表)。
/*HDOJ1285 作者:陈佳润 2013-04-17 */ #include<iostream> using namespace std; typedef struct tag_node{//邻接表的边域节点 int data; struct tag_node *next; }Node; typedef struct tag{//邻接表 int num; Node *node; }Table; int main() { Table table[501]; int i,n,m,a,b,j; Node *p; //freopen("1.txt","r",stdin); while(cin>>n>>m){ for(i=1;i<=n;i++){//初始化 table[i].num=0; table[i].node=NULL; } for(i=1;i<=m;i++){//构造邻接表 cin>>a>>b; table[b].num++; p=new Node; p->data=b; p->next=table[a].node; table[a].node=p; } for(i=1;i<=n;i++){//开始排序 for(j=1;j<=n;j++){//找到一个没有前驱的点 if(table[j].num==0){//如果该点没有前驱 cout<<j; if(i!=n) cout<<" "; table[j].num=-1;//表示该点已经用过 while(table[j].node!=NULL){//让该点的所有后继点的前驱总数-1 p=table[j].node; table[j].node=table[j].node->next; table[p->data].num--; } break; } } } cout<<endl; } return 0; }