1285試合順位決定【トポロジーソート】
2393 ワード
試合の順位を決める
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17239 Accepted Submission(s): 6860
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
Sample Output
トポロジーソート、有向図をソートします.具体的なルールは、入度がゼロの点を優先して、この点が接続されているすべてのエッジを削除して、一度に行うと、ソートの結果が得られます.
この问题は自分で大体理解して、考え方によってプログラムを书いて、まず入度がゼロの点を探し当てて、それから出力して、この点の接続の辺をすべて取り除いて、顺次循环して、相応のシーケンスを出力しました.....
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17239 Accepted Submission(s): 6860
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
トポロジーソート、有向図をソートします.具体的なルールは、入度がゼロの点を優先して、この点が接続されているすべてのエッジを削除して、一度に行うと、ソートの結果が得られます.
この问题は自分で大体理解して、考え方によってプログラムを书いて、まず入度がゼロの点を探し当てて、それから出力して、この点の接続の辺をすべて取り除いて、顺次循环して、相応のシーケンスを出力しました.....
#include<stdio.h>
#include<string.h>
int n,x[505][505],ind[505];
void tpsort()
{
int i,j,k;
for(i=0;i<n;++i)//
{
for(j=1;j<=n;++j)//
{
if(ind[j]==0)
{
break;//
}
}
if(i<n-1)//
{
printf("%d ",j);
}
else
{
printf("%d
",j);
}
ind[j]=-1;//
for(k=1;k<=n;++k)//
{
if(x[j][k])
{
--ind[k];// , 1
}
}
}
}
int main()
{
int m,i,j,a,b;
while(~scanf("%d%d",&n,&m))
{
memset(x,0,sizeof(x));
memset(ind,0,sizeof(ind));
for(i=0;i<m;++i)
{
scanf("%d%d",&a,&b);
if(!x[a][b])//
{
x[a][b]=1;
++ind[b];
}
}
tpsort();//
}
return 0;
}