确定比赛名次

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 40   Accepted Submission(s) : 31
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
 题解:拓扑结构,可以用N种方法;
代码一:拓扑结构模板
 #include<stdio.h>
#include<string.h>
const int MAXN=;
int N,M;
int map[MAXN][MAXN];
int que[MAXN],ans[MAXN];
void topu(){int k,top=,temp;
for(int i=;i<N;i++){
temp=-;
for(int j=;j<=N;j++){
if(!que[j]){
ans[top++]=j;
que[j]=-;
k=j;
temp=;
break;
}
}
if(temp==-)break;
for(int j=;j<=N;j++){
if(map[k][j])que[j]--;
}
}
for(int i=;i<top;i++){
if(i)printf(" ");
printf("%d",ans[i]);
}
puts("");
}
void initial(){
memset(map,,sizeof(map));
memset(que,,sizeof(que));
}
int main(){
int a,b;
while(~scanf("%d%d",&N,&M)){
initial();
while(M--){
scanf("%d%d",&a,&b);
if(!map[a][b]){
map[a][b]=;
que[b]++;
}
}
topu();
}
return ;
}

代码二:邻接表:

 #include<stdio.h>
#include<string.h>
const int MAXN=;
struct Node{
int next,to;
};
Node edg[MAXN];
int head[MAXN];
int que[MAXN],ans[MAXN],top;
int N,M;
void topu(){int k;
for(int i=;i<N;i++){
int temp=-;
for(int j=;j<=N;j++){
if(!que[j]){
temp=;
k=j;
que[j]=-;
ans[top++]=j;
break;
}
}
if(temp==-)break;
for(int j=head[k];j!=-;j=edg[j].next){
que[edg[j].to]--;
}
}
for(int i=;i<top;i++){
if(i)printf(" ");
printf("%d",ans[i]);
}
puts("");
}
void initial(){
memset(head,-,sizeof(head));
memset(que,,sizeof(que));
top=;
}
int main(){int a,b;
while(~scanf("%d%d",&N,&M)){
initial();
for(int i=;i<=M;i++){
scanf("%d%d",&a,&b);
edg[i].to=b;
edg[i].next=head[a];
head[a]=i;
que[b]++;
}
topu();
}
return ;
}

代码三:map+邻接表;

 #include<stdio.h>
#include<string.h>
#include<map>
using namespace std;
const int MAXN=;
struct Node{
int to,next;
};
int head[MAXN];
Node edg[MAXN];
int ans[MAXN],top;
int N,M;
map<int,int>mp;
void topu(){map<int,int>::iterator iter;
//for(iter=mp.begin();iter!=mp.end();iter++){
// printf("%d %d\n",iter->first,iter->second);
// }
for(int i=;i<N;i++){
for(iter=mp.begin();iter!=mp.end();iter++){
if(!iter->second)break;
}
if(iter==mp.end())break;
mp.erase(iter);
ans[top++]=iter->first;
for(int j=head[iter->first];j!=-;j=edg[j].next){
mp[edg[j].to]--;
}
}
for(int i=;i<top;i++){
if(i)printf(" ");
printf("%d",ans[i]);
}
puts("");
}
void initial(){
memset(head,-,sizeof(head));
top=;
mp.clear();
for(int i=N;i>;i--)mp[i]=;
}
int main(){int a,b;
while(~scanf("%d%d",&N,&M)){
initial();
for(int i=;i<M;i++){
scanf("%d%d",&a,&b);
edg[i].to=b;
edg[i].next=head[a];
head[a]=i;
mp[b]++;
}
topu();
}
return ;

代码四:队列+邻接表;

 #include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int MAXN=;
struct Node{
int to,next;
};
int head[MAXN],que[MAXN];
Node edg[MAXN];
int ans[MAXN],top;
int N,M;
priority_queue<int,vector<int>,greater<int> >dl;
void topu(){
for(int j=;j<=N;j++){
if(!que[j])dl.push(j);
}
while(!dl.empty()){
ans[top++]=dl.top();
int k=dl.top();
que[k]=-;
dl.pop();
for(int j=head[k];j!=-;j=edg[j].next){
que[edg[j].to]--;
if(!que[edg[j].to])dl.push(edg[j].to);
}
}
for(int i=;i<top;i++){
if(i)printf(" ");
printf("%d",ans[i]);
}
puts("");
}
void initial(){
memset(head,-,sizeof(head));
top=;
memset(que,,sizeof(que));
while(!dl.empty())dl.pop();
}
int main(){int a,b;
while(~scanf("%d%d",&N,&M)){
initial();
for(int i=;i<M;i++){
scanf("%d%d",&a,&b);
edg[i].to=b;
edg[i].next=head[a];
head[a]=i;
que[b]++;
}
topu();
}
return ;
}

今天比赛这个题错了好多次。。。。

知道真相的我眼泪流了下来。。。

我没有判断重边。。。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x);
const int MAXN=510;
int que[MAXN],mp[MAXN][MAXN];
int ans[MAXN];
int N;
priority_queue<int,vector<int>,greater<int> >dl;
/*void topu(){
int a,k=0;
while(!dl.empty())dl.pop();
for(int i=1;i<=N;i++)
if(!que[i]){
dl.push(i);
que[i]=-1;
}
while(!dl.empty()){
a=dl.top();
dl.pop();
que[a]=-1;
ans[k++]=a;
for(int i=1;i<=N;i++)
if(mp[a][i]){
que[i]--;
if(!que[i])
dl.push(i);
}
}
for(int i=0;i<k;i++){
if(i)printf(" ");
printf("%d",ans[i]);
}puts("");
}*/
void topu(){
int k=0;
for(int i=0;i<N;i++){
int a;
for(int j=1;j<=N;j++){
if(!que[j]){
a=j;break;
}
}
ans[k++]=a;
que[a]=-1;
for(int j=1;j<=N;j++){
if(mp[a][j])que[j]--;
}
}
for(int i=0;i<k;i++){
if(i)printf(" ");
printf("%d",ans[i]);
}puts("");
}
int main(){
int M,a,b;
while(~scanf("%d%d",&N,&M)){
mem(que,0);mem(mp,0);
for(int i=0;i<M;i++){
scanf("%d%d",&a,&b);
if(!mp[a][b]){//******
mp[a][b]=1;
que[b]++;
}
}
topu();
}
return 0;
}

  

确定比赛名次(map+邻接表 邻接表 拓扑结构 队列+邻接表)的更多相关文章

  1. HDU 1285--确定比赛名次【拓扑排序 &amp;&amp; 邻接表实现】

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  2. hdoj 1285 确定比赛名次【拓扑排序】

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  3. 杭州电子科技大学Online Judge 之 “确定比赛名次(ID1285)”解题报告

    杭州电子科技大学Online Judge 之 "确定比赛名次(ID1285)"解题报告 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozh ...

  4. HDU 1285 确定比赛名次

    传送门 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  5. hduoj 1285 确定比赛名次

    http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory ...

  6. 深入理解PHP内核(六)哈希表以及PHP的哈希表实现

    原文链接:http://www.orlion.ga/241/ 一.哈希表(HashTable) 大部分动态语言的实现中都使用了哈希表,哈希表是一种通过哈希函数,将特定的键映射到特定值得一种数据 结构, ...

  7. HDU 1285 确定比赛名次(简单拓扑排序)

    题目链接: 传送门 确定比赛名次 Time Limit: 1000MS     Memory Limit: 65536K Description 有N个比赛队(1 Input 输入有若干组,每组中的第 ...

  8. ACM: HDU 1285 确定比赛名次 - 拓扑排序

     HDU 1285 确定比赛名次 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u De ...

  9. HDU 1285 拓普排序 基本模板例题 确定比赛名次

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

随机推荐

  1. gem update --system 302 错误 解决方案(转)

    具体过程如下: 1.InstantRails-2.0安装后,在配置环境变量path中配置ruby/bin目录(如果系统中有多个RUBY,执行命令行的时候系统认的就是path中的) 2.进入DOS命令行 ...

  2. ACM计算几何题目推荐

    //第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...

  3. poj 1458 Common Subsequence_最长公共子串

    题意:略 求最长公共子串 #include<iostream> #include<cstdio> #include<string> using namespace ...

  4. 一道google面试题(dp)

    输入n,把1-n分成两个和相等的子集,有多少种分法 想了个dp,直接背包也行 #include <iostream> #include <cstdio> using names ...

  5. 安装android studio时,解决unable to access android sdk add-on list

    1.打开时提示如下错误. 2.在安装路径下找到idea.properties文件,用记事本打开,添加disable.android.first.run=true,保存即可. 3.再次打开Android ...

  6. gmapping 学习

    为解决斜坡下gmapping定位的问题,开始关注gmapping. 先看到EAIPOT博客里关于gmapping的一个参数文件 <launch> <arg name="sc ...

  7. C#中的反射原理及应用(转)

    反射的概述 反射的定义:审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等, ...

  8. 3-07. 求前缀表达式的值(25) (ZJU_PAT数学)

    题目链接:http://pat.zju.edu.cn/contests/ds/3-07 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,比如2+3*(7 ...

  9. 依赖注入及AOP简述(九)——单例和无状态Scope .

    三.依赖注入对象的Scope及其生命周期 在前面的章节我们讲到,依赖注入容器之所以能够区别于以往的ServiceLocator等容器,是在于其不但能够自动构建多层次的.完整的依赖关系图,并且可以管理依 ...

  10. css3动画之animate

    CSS3 动画属性 下面的表格列出了 @keyframes 规则和所有动画属性: 语法:div{animation: 动画名称 一个周期播放时间 速度曲线 延迟时间 下个周期是否逆向} @keyfra ...