拓扑排序 --- 模板题

确定比赛名次


Time
Limit: 2000/1000 MS (Java/Others)    Memory Limit:
65536/32768 K (Java/Others)
Total Submission(s):
10536    Accepted Submission(s):
4120

Problem Description


N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排
名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定
排名。

Input

输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。

Output

给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。

其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。

Sample Input

4 3 1 2 2 3 4
3

Sample Output

1 2 4 3

【题目来源】

杭电ACM集训队训练赛(VII)

【题目分析】

拓扑排序算法:该算法是简单而直观的,实质上属于广度优先遍历,因此称为广度优先拓扑排序算法。该算法包含下列几个步骤:

           

[1]
从有向图中找一个没有前趋的结点v,若v不存在,则表明不可进行拓扑排序(图中有环路),结束(不完全成功);

          

[2] 将v输出;

   

[3] 将v从图中删除,同时删除关联于v的所有的边

    

[4] 若图中全部结点均已输出,则结束(成功),否则转[1]继续进行


#include<iostream>
#include<cstring>
using namespace std;
int n,m,i,j,a,b,k; //队伍数量、排名数量
int pur[520]; //存放top排序后的顺序
bool Map[520][520]; //存放有向图
int indegree[520]; //存放每个节点的入度

void topsort()
{
k=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(indegree[j]==0)
{
indegree[j]--;
pur[k++]=j;
for(int l=1;l<=n;l++)
{
if(Map[j][l])
indegree[l]--;
}
break;
}
if(j>=n)
{
cout<<"尼玛!存在环\n"<<endl;
return;
}
}
}
}

int main()
{
while((cin>>n>>m)!=NULL)
{
memset(indegree,0,sizeof(indegree));
memset(Map,0,sizeof(Map));
for(i=1;i<=m;i++)
{
cin>>a>>b;
if(!Map[a][b]) //无环图中每个节点只可能有一个前驱,所以Map[][]只可能被赋值一次
{
Map[a][b]=1;
indegree[b]++;
}
}
topsort();
for(i=1;i<=n;i++)
if(i==1)
cout<<pur[i];
else cout<<" "<<pur[i];
cout<<endl;
}
return 0;
}

拓扑排序 --- 模板题,布布扣,bubuko.com

时间: 2024-12-26 16:06:35

拓扑排序 --- 模板题的相关文章

hdu 1285 确定比赛名次 简单的拓扑排序模板题~~需要注意重边

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13819    Accepted Submission(s): 5547 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

Poj 1094 拓扑排序 水题

Sad..这么水的题WA了无数发,题目要看仔细啊,留下来做个警告把 #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #i

HDU 1285 确定比赛名次(拓扑排序模板)

题意还是比较容易理解的,关键要看到后面的:合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前: 思路:这道题就是拓扑排序的经典应用了,用队列做的考虑优先编号小的出队就可以了. 拓扑排序: 拓扑排序是对有向无回路图(DAG)顶点的一种排序,它使得如果存在从u到v的有向路径,那么满足序列中u在v前. 所以我们的算法可以描述为这样一个过程: 1.找到整个图中所有的度为0的点,将这些点压进队列(栈)中 2.从队列(栈)中取出一点,输出,将该点及它的边删除,找到它所指向的点,如果改点是一个原点(删

hdu--1811--并查集&amp;&amp;拓扑排序&lt;好题&gt;

做了这题 绝逼 累啊.. mle -- re<stack overflow>--tle--wa---ac 经过这么5步 终于AC了 这题 我觉得可以让你更好地来 理解 拓扑排序的一些细节问题 首先 这题 为什么要用到并查集呢? 因为 会有 A = B这种情况的出现 然后可能再来个 B =C A = D....那么我们就需要将它们全部表示成一个点 那么就是都用一个根结点来表示 然后 这边 是要判断 能不能根据给出的条件 形成一个排列 那么就是个 拓扑问题 根据 > <情况来判断 我觉

UVa 10305 - Ordering Tasks (拓扑排序裸题)

John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task is only possible if other tasks have already been executed. Input The input will consist of several instances of the problem. Each instance begins with

HDU 1285 确定比赛名次(拓扑排序基础题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 题目: 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前.现在请你编程序确定排名. Input 输入有若干组,每组中的第一行为二个数N(1<=N<=500),M:其中N表示队

拓扑排序模板

拓扑排序是对ADG(有向无环图进行线性排序) 模板: 队列实现 #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; int indegree[100]; queue<int> q; int n,m; bool map[100][100]; int a[100]; int topo(int n) { int cnt =

HDU 1285 确定比赛名次 拓扑排序水题

Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前.现在请你编程序确定排名. Input 输入有若干组,每组中的第一行为二个数N(1<=N<=500),M:其中N表示队伍的个数,M表示接着有M行的输入数据.接下来的M行数据中,每行也有两个整

HDU 3342 -- Legal or Not【裸拓扑排序 &amp;&amp;水题】

Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5906    Accepted Submission(s): 2734 Problem Description ACM-DIY is a large QQ group where many excellent acmers get together. It is