HDu 1285(試合順位決定)(トポロジーソート)
3279 ワード
試合の順位を決める
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
コードは次のとおりです.
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
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