HDu 1285(試合順位決定)(トポロジーソート)


試合の順位を決める
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 13212    Accepted Submission(s): 5291
Problem Description
Nチーム(1<=N<=500)があり、番号は1、2、3、...Nは試合を行い、試合が終わった後、審判委員会はすべての参加チームを行った後から順番に順位をつけなければならないが、現在、審判委員会は直接各チームの試合成績を得ることができず、各試合の結果、すなわちP 1がP 2に勝ったことしか知らず、P 1,P 2で表され、順位はP 1がP 2の前にある.今、プログラムを作ってランキングを確定してください.
 
Input
入力にはいくつかのグループがあり、各グループの第1の動作の2つの数N(1<=N<=500)、M;ここで、Nは行列の個数を表し、MはM行に続く入力データを表す.次のM行データでは、行ごとに2つの整数P 1があり、P 2はP 1チームがP 2チームに勝ったことを示す.
 
Output
要件に合致するランキングを与えます.出力時にキュー番号の間にスペースがあり、最後の名前の後ろにスペースがありません.
その他の説明:条件に合致する順位は唯一ではない可能性があります.この場合、出力時の番号の小さいチームが上位にあることが要求されます.入力データは正しいことを保証します.すなわち、入力データは必ず要求に合致するランキングを確保します.
 
Sample Input
 
   
4 3 1 2 2 3 4 3
 

Sample Output
 
   
1 2 4 3
 

Author
SmallBeer(CML)
 

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

参考代码链接:
http://blog.csdn.net/yu_ch_sh/article/details/38542819
拓扑排序方法小结:
(一):从有向图中选择一个没有前驱(即入度为零)的节点,并且输出他;
(二):从网中删除掉该顶点,并且删除从该顶点发出的全部的有向边:
(三):重复步骤一二,直到剩余的网中不在存在没有前驱的顶点为止:
 代码如下:
#include
#include
int map[1010][1010];
int dr[1010],ans[1010];
int main()
{
	int n,m,i,j,x,y;
	while(~scanf("%d%d",&n,&m))
	{
		memset(ans,0,sizeof(ans));
		memset(map,0,sizeof(map));
		memset(dr,0,sizeof(dr));
		//          
		for(i=0;i
知識点を調べる:トポロジーソートテンプレート問題.
コードは次のとおりです.
#include
#include
#define inf 550
int map[inf][inf],in[inf];
int n;
void topo()//       
{
	for(int i=1;i<=n;++i)//  n    
	{
		for(int j=1;j<=n;++j)//            n    
		{
			if(!in[j])//         
			{
				in[j]--;//          
				if(i!=n)//              
				printf("%d ",j);
				else
				printf("%d
",j); for(int k=1;k<=n;++k)// n , j { if(map[j][k]) in[k]--; } break; } } } } int main() { int m; int a,b; while(~scanf("%d%d",&n,&m)) { memset(map,0,sizeof(map)); memset(in,0,sizeof(in)); for(int i=0;i