XM15. 比赛名次
描述
有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。输入描述
输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。输出描述
给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。示例1
输入:
4 3 1 2 2 3 4 3
输出:
1 2 4 3
C++ 解法, 执行用时: 35ms, 内存消耗: 1164KB, 提交时间: 2021-08-01
#include <bits/stdc++.h> using namespace std; const int maxn = 502; int main(){ int n, m; while(scanf("%d%d", &n, &m) != EOF){ int in[maxn] = {0}; vector<int> aps[maxn]; priority_queue<int, vector<int>, greater<int>> q; for(int i=0; i<m; i++){ int a, b; scanf("%d%d", &a, &b); in[b]++; aps[a].push_back(b); } for(int i=1; i<=n; i++){ if(in[i] == 0){ q.push(i); } } int cnt = 0; while(! q.empty()){ int u = q.top(); q.pop(); cnt++; printf("%d", u); if(cnt < n) printf(" "); for(auto v:aps[u]){ in[v]--; if(in[v] == 0) q.push(v); } } printf("\n"); } return 0; }
C 解法, 执行用时: 35ms, 内存消耗: 1372KB, 提交时间: 2021-08-31
#include <stdio.h> #include <string.h> #define N 501 //创建一个度和图 int Indegree[N]; int Graph[N][N]; int main(){ int n,m; int a,b; int count; while(scanf("%d %d",&n,&m) != EOF){ //对图和度进行初始化 memset(Graph,0,sizeof(Graph)); memset(Indegree,0,sizeof(Indegree)); count = 0; //对度和图进行一个赋值 for(int i = 0; i < m; i++){ scanf("%d %d",&a,&b); if(Graph[a][b] == 0){ Graph[a][b] = 1; Indegree[b]++; } } //开始循环拓扑 for(int i = 0; i < n; i++){ int flag = n + 1; for(int j = 1; j <= n; j++){ if(Indegree[j] == 0){ Indegree[j] = -1; flag = j; count++; break; } } if(flag == n + 1) return 0;//若一趟查找,没有可拓扑的顶点,直接退出 if(count == 1){ printf("%d",flag); } else{ printf(" %d",flag); } for(int k = 1; k <= n; k++){//更新图信息 if(Graph[flag][k] == 1){ Indegree[k]--; } } } printf("\n"); } return 0; }