您的位置:首页 > 其它

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

2013-04-17 16:33 357 查看
标准的拓扑排序,用邻接表来存储

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

/*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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: