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;
}


原文地址:https://www.cnblogs.com/xinyuyuanm/p/3027016.html