确定比赛名次

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17036    Accepted Submission(s):
6747

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<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int s[510];
int n,m;
int map[510][510];
int vis[510];
void init()
{
int i,j,a,b;
memset(vis,0,sizeof(vis));
memset(map,0,sizeof(map));
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
if(!map[a][b])
{
vis[b]++;//连接b的边的条数
map[a][b]=1;//标记a b已经连接
}
}
}
void topu()
{
int i,j,ans=0;
priority_queue<int,vector<int>,greater<int> >q;
while(!q.empty())//清空队列
q.pop();
for(i=1;i<=n;i++)
{
if(vis[i]==0)
q.push(i); //将 没有依赖顶点的节点入队
}
int u;
while(!q.empty())
{
u=q.top();
s[ans++]=u;//将上边选出的没有依赖顶点的节点加入到排序结果中
q.pop();//删除队顶元素
for(i=1;i<=n;i++)
{
if(map[u][i])
{
vis[i]--;//删去以u为顶点的边
if(vis[i]==0)//如果节点i的所有依赖顶点连接边都已经删去
q.push(i);//即变为无依赖顶点的节点 将其入队
}
}
if(ans==n)
{
for(i=0;i<ans;i++)
{
if(i==0)
printf("%d",s[i]);
else
printf(" %d",s[i]);
}
printf("\n");
}
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
topu();
}
return 0;
}

  邻接表:

#include<string.h>
#include<stdio.h>
#include<queue>
#include<vector>
using namespace std;
#define MAX 510
vector<int>map[MAX];
int vis[MAX],a[MAX];
int n,m;
void getmap()
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
map[i].clear();
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
map[a].push_back(b);
vis[b]++;
}
}
void tuopu()
{
int i,j;
priority_queue<int,vector<int>,greater<int> >q;
while(!q.empty())
q.pop();
for(i=1;i<=n;i++)
if(vis[i]==0)
q.push(i);
int u;
int ans=0;
memset(a,0,sizeof(a));
while(!q.empty())
{
u=q.top();
a[ans++]=u;
q.pop();
for(i=0;i<map[u].size();i++)
{
int v=map[u][i];
vis[v]--;
if(vis[v]==0)
q.push(v);
}
}
printf("%d",a[0]);
for(i=1;i<n;i++)
printf(" %d",a[i]);
printf("\n");
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
getmap();
tuopu();
}
return 0;
}

  

hdoj 1285 确定比赛名次【拓扑排序】的更多相关文章

  1. HDOJ 1285 确定比赛名次(拓扑排序)

    Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委 ...

  2. HDU.1285 确定比赛名次 (拓扑排序 TopSort)

    HDU.1285 确定比赛名次 (拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 只不过这道的额外要求是,输出字典序最小的那组解.那么解决方案就是 ...

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

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

  4. hdu 1285 确定比赛名次 拓扑排序

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛 ...

  5. HDU 1285 确定比赛名次 拓扑排序模板题

    http://acm.hdu.edu.cn/showproblem.php?pid=1285 #include <cstdio> #include <cstdlib> #inc ...

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

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

  7. hdu1285 确定比赛名次(拓扑排序多种方法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 Problem Description 有N个比赛队(1<=N<=500),编号依次 ...

  8. hdu 1285 确定比赛名次 (拓扑)

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

  9. [ACM] hdu 1285 确定比赛 (拓扑排序)

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

随机推荐

  1. 完全步卸载oracle11g步骤

    完全 步 卸载oracle11g骤: . 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务.  . 开始->程序->Oracle - OraH ...

  2. Action<>和Func<>区别

    Action<>和Func<>其实都是委托的[代理]简写形式. 简单的委托写法: //普通的委托 public delegate void myDelegate(string ...

  3. 拥抱模块化的JavaScript

    前言 我们再一次被计算机的名词.概念笼罩. Backbone.Emberjs.Spinejs.Batmanjs 等MVC框架侵袭而来.CommonJS.AMD.NodeJS.RequireJS.Sea ...

  4. Python:元组(tuple)

    #!/usr/bin/python3 #元组 tup1 = ('Google', 'Runoob', 1997, 2000) print(type(tup1)) print("tup1 &q ...

  5. C# 绘制窗体客户非客户区要用WM_PAINT和WM_NCPAINT

    窗体分为两部分:客户区(Client area)和非客户区(Non-Client area) WM_PAINT消息.OnPaint()方法.GetDC()API函数都是处理窗体客户区绘制的   而标题 ...

  6. SQL70001: This statement is not recognized in this context.

    关于错误: SQL70001: This statement is not recognized in this context. 的产生原因以及解决办法.   在SQL Server Databas ...

  7. winform C#屏幕右下角弹出消息框并自动消失

    ①弹出信息框后慢慢下降消失 在主窗体中新增按钮重命名为btnShowAndDisappearMessages,在click事件中写如下代码: private void btnShowAndDisapp ...

  8. 使用APT减少MVP的冗余代码

    前言 不知道从何时起,移动端开发都开始采用MVP.我们在认识到MVP有点的时候,也不妨会察觉到它其实也有很多恼人的地方,比如,我们针对每种状态渲染不同的视图: private void renderI ...

  9. Jquery 和 Js

     jQuery  [一]  jQuery     1: javaScript和 javaScript库:        (1) javaScript自身存在的3个弊端:复杂的文档对象模型(DOM),不 ...

  10. JQuery 字符串截取

    //字符串截取,全小写 strObj.substring(startIndex,endIndex); //需要注意大小写 strObj.lastIndexOf(String splitObj); // ...