http://acm.hdu.edu.cn/showproblem.php?pid=1285
确定比赛名次
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 18484 Accepted Submission(s): 7399
Problem Description
有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
学了一点后自己写的
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; #define N 1100 #define met(a,b) (memset(a,b,sizeof(a))) typedef long long LL; struct nnode { int u, v; }a[N]; struct node { int num; bool friend operator < (node n1, node n2) { return n1.num > n2.num; } }; vector<int>G[N]; int r[N], b[N], k, n; ///r[i] 第i个点的入度 void Slove() { int i; node p, q; priority_queue<node>Q; for(i=1; i<=n; i++) { if(r[i]==0) { p.num = i; Q.push(p); } } while(Q.size()) { p = Q.top(), Q.pop(); b[k++] = p.num; int len = G[p.num].size(); for(i=0; i<len; i++) { int v = G[p.num][i]; r[v]--; if(!r[v]) { q.num = v; Q.push(q); } } } } int main() { int m; while(scanf("%d%d", &n, &m)!=EOF) { int i; met(a, 0); met(r, 0); met(b, 0); for(i=0; i<=n; i++) G[i].clear(); for(i=1; i<=m; i++) { scanf("%d%d", &a[i].u, &a[i].v); r[a[i].v]++; G[a[i].u].push_back(a[i].v); } k=0; Slove(); for(i=0; i<k; i++) printf("%d%c", b[i], i==k-1?' ':' '); } return 0; } /** 4 3 1 2 2 3 4 3 4 3 4 3 3 2 2 1 */
之前看别人的代码
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define N 550
int v[N][N], s[N];
void Put(int n)
{
int i, j, k;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
if(s[j]==0)
{
s[j]--;
if(i==n) printf("%d
", j);
else printf("%d ", j);
for(k=1; k<=n; k++)
{
if(v[j][k])
{
s[k]--;
}
}
break;
}
}
}
int main()
{
int n, m;
while(scanf("%d%d", &n, &m)!=EOF)
{
int i, a, b;
memset(v, 0, sizeof(v));
memset(s, 0, sizeof(s));
for(i=1; i<=m; i++)
{
scanf("%d%d", &a, &b);
if(!v[a][b])
{
v[a][b] = 1;
s[b]++;
}
}
Put(n);
}
return 0;
}