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

来源:互联网 发布:网络教育公共课考试 编辑:程序博客网 时间:2024/05/12 15:15

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

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


/*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){//让该点的所有后继点的前驱总数-1p=table[j].node;table[j].node=table[j].node->next;table[p->data].num--;}break;}}}cout<<endl;}return 0;}


原创粉丝点击