确定比赛名次
题目描述:
有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
这道题就是一个简单的拓扑排序,可以顺便看一下我的拓扑排序blog
传送门:https://blog.csdn.net/qq_42875611/article/details/82928028
前代码如下:还未AC
#include <bits/stdc++.h>
using namespace std;
const int maxn=100+5,maxm=1000+5;
int a[maxn][maxn],rd[maxn],n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
a[x][y]=1;
rd[y]++;
}
for(int i=1;i<=n;i++){
int k;
for(int j=1;j<=n;j++)
if(rd[j]==0){
k=j;
break;
}
cout<<k<<" ";
rd[k]=-1;
for(int j=1;j<=n;j++)
if(a[k][j])
rd[j]--;
}
return 0;
}
问题所在
1.有重边!!!
2.输入有无数个,要用while(cin>>n>>m) 233333
3.数组开小了,原数组定义范围:100+5,现定义500+500
4.每一次数组都要清零
所以,改进后代码,已AC:
#include <bits/stdc++.h>
using namespace std;
const int maxn=500+5,maxm=1000+5;
int a[maxn][maxn],rd[maxn],n,m;
int main(){
while(cin>>n>>m){//不停地读入
memset(a,0,sizeof(a));//一波清零的操作
memset(rd,0,sizeof(rd));
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
if(a[x][y])//重边的情况2333
continue;//继续就是了
a[x][y]=1;
rd[y]++;
}
for(int i=1;i<=n;i++){
int k;
for(int j=1;j<=n;j++)
if(rd[j]==0){
k=j;
break;
}
if(i<n)
cout<<k<<" ";
else
cout<<k<<endl;
rd[k]=-1;
for(int j=1;j<=n;j++)
if(a[k][j])
rd[j]--;
}
}
return 0;
}
至于注释内其他的情况,参上一个错误代码内的注释即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn=510;
vector<int>e[maxn];
int rd[maxn];
priority_queue <int> q;
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++)e[i].clear();
memset(rd,0,sizeof(rd));
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
e[x].push_back(y);
rd[y]++;
}
int f=1,l=0;
for(int i=1;i<=n;i++)
if(rd[i]==0)q.push(-i);
int k=q.top()*-1;
q.pop();
printf("%d",k);
for(int i=0;i<e[k].size();i++){
int u=e[k][i];
rd[u]--;
if(rd[u]==0)q.push(-u);
}
while(!q.empty()){
int k=q.top()*-1;
q.pop();
printf(" %d",k);
for(int i=0;i<e[k].size();i++){
int u=e[k][i];
rd[u]--;
if(rd[u]==0)q.push(-u);
}
}
cout<<endl;
}
return 0;
}
这道题就到此结束吧!!!