HDOJ1285 确定比赛名次(拓扑排序)

标准的拓扑排序,用邻接表来存储

邻接表的下标表示节点序号,邻接表内容包括两个部分,一个是该节点的前驱数目,一个是后继链表(存放其所有后继的链表)。


 

/*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;

}


 

 

你可能感兴趣的:(排序)