HDU 1285 确定比赛名次 拓扑排序(邻接矩阵 邻接表
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
Input
Output
其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
Sample Input
4 3 1 2 2 3 4 3
Sample Output
1 2 4 3 一开始是先用邻接矩阵做 这样做思路比较简单但是数据一大的话就会爆内存 而且比起邻接表也慢了很多
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <iomanip>
#include <math.h>
#include <map>
using namespace std;
#define FIN freopen("input.txt","r",stdin);
#define FOUT freopen("output.txt","w",stdout);
#define INF 0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long LL;const int MAXN=1000+5;int Map[MAXN][MAXN],cnt[MAXN];int main()
{//FINint N,M,x,y;while(~scanf("%d%d",&N,&M)){memset(Map,0,sizeof(Map));memset(cnt,0,sizeof(cnt));for(int i=1;i<=M;i++){scanf("%d%d",&x,&y);if(Map[y][x]==0) cnt[y]++;Map[y][x]=1;}for(int i=1;i<=N;i++){int j;for(j=1;j<=N;j++) {if(cnt[j]==0) break;}cnt[j]--;if(i<N) printf("%d ",j);else printf("%d",j);for(int z=1;z<=N;z++){if(Map[z][j]==1) cnt[z]--;}}printf("\n");}return 0;
}
第二种是优化过的邻接表
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <iomanip>
#include <math.h>
#include <map>
using namespace std;
#define FIN freopen("input.txt","r",stdin);
#define FOUT freopen("output.txt","w",stdout);
#define INF 0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long LL;const int MAXN=1e5+5;/*判断一个有向图是否有环
每次删除一个入度为0的点,直到没有入度为0的点为止。
如果这时还有点没被删除,这些没被删除的点至少组成一个环;
反之如果所有点都被删除了,则有向图中一定没有环。*/struct Edge{int v,nxt;
}E[MAXN*2];int Head[MAXN],erear;
int IN[MAXN]; //记录入度
int P[MAXN],sz; //打印用void edge_init(){erear=0;memset(Head,-1,sizeof(Head));memset(IN,0,sizeof(IN));
}void edge_add(int u,int v){E[erear].v=v;E[erear].nxt=Head[u];Head[u]=erear++;}int main()
{//FINint n,m;while(~scanf("%d%d",&n,&m)){edge_init(); //初始化for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);edge_add(u,v);IN[v]++; //v的入度+1}sz=0;priority_queue<int,vector<int>,greater<int> >Q; //这题要用到优先队列for(int i=1;i<=n;i++){if(!IN[i]) Q.push(i); //把入度为0的加入队列}bool sign=0; //判断是否有多个结果while(!Q.empty()){if(Q.size()>=2) sign=1;int u=Q.top();Q.pop();P[sz++]=u; //把要打印的数加入Pfor(int i=Head[u];~i;i=E[i].nxt){ //普通遍历int v=E[i].v;IN[v]--; //删边if(!IN[v]) Q.push(v); //如果删边后新点入度为0加入队列}}if(sz!=n){ //如果不可能的话printf("invalid\n");return 0;}/*if(sign){printf("multi ans\n");return 0;}*/for(int i=0;i<sz;i++){if(i==0) printf("%d",P[i]);else printf(" %d",P[i]);}printf("\n");}return 0;
}
转载于:https://www.cnblogs.com/Hyouka/p/5739070.html
HDU 1285 确定比赛名次 拓扑排序(邻接矩阵 邻接表相关推荐
- [ACM] hdu 1285 确定比赛 (拓扑排序)
确定比赛 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1285 - 确定比赛名次(拓扑排序)
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- [ACM] hdu 1285 确定比赛名次 (拓扑排序)
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- HDU-1285 确定比赛名次 拓扑排序
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu 1285 确定比赛名次
//拓扑排序裸题,题目要求按编号从小到大输出,要换一种思维去思考 //按照数据结构课本的算法,建立邻接表,用栈实现.初始化先将入度为0的顶点入栈,然后以栈顶顶点为准,先将栈顶顶点出栈输出它的信息,然后 ...
- hdoj 1285 确定比赛名次 【拓扑排序】
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- HDU - 128 确定比赛名次(基于有向无环图(GAD)的排序--拓扑排序)
题目链接:https://vjudge.net/contest/325616#problem/A 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N,进行比赛,比赛结束 ...
- HDU 1285--确定比赛名次【拓扑排序 amp;amp; 邻接表实现】
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 拓扑排序杭电 1285确定比赛名次
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
最新文章
- 06列表的常用基本操作
- 看了这几幅图,感觉自己物理白学了!
- mysql empty table_【MySQL】 empty table and delete table.
- 《大型数据库技术》MySQL的进阶开发技巧
- window下git,TortoiseGit安装,以及和github托管项目
- 简单好用的应用加密软件:Cisdem AppCrypt Mac版
- Modis数据下载与处理(mrt、wget)
- App Store审核规则中文版(App审核被拒原因,苹果开发必备)
- FlowJo For Mac(流式细胞分析器工具)
- 在Visual Studio中对Epicor10进行二次开发
- iKuai软路由模拟环境搭建
- Win10鼠标点一下文件夹或文件没有选中的那个蓝色,但还是能正常用,比如双击跟右键,点一下也有详细信息
- 兔子c语言程序,可爱的C语言程序。....兔子问题...斐波那契数列
- 图像处理冷知识——dpi和ppi
- win10打开任务管理器的快捷键
- 创建两个文本框,一个按钮。第 1 个文本框绑定任意键事件,敲击键盘任意可显示字符,在交互窗口中显示该字符;
- 笔记本写代码 屏幕尺寸_为什么笔记本电脑的屏幕尺寸如此奇怪?
- 服务器带宽什么意思?服务器带宽多少合适?
- 第五届世界人工智能大会 • 腾讯“智变未来”论坛召开
- eBPF程序摄像头——力争解决可观测性领域未来最有价值且最有挑战的难题
热门文章
- nginx-0.1.0文件分析3:ngx_send.c
- CSS有效的编写代码
- 将csv文件导入mysql
- 为什么电脑不能打字_为什么新电脑不能安装win7系统?
- burpsuite 设置https_新手教程:如何使用Burpsuite抓取手机APP的HTTPS数据
- 教你如何运用golang 实现数组的随机排序
- ASP.NET Razor – C# 循环和数组简介
- 必须安利的KubernetesDevOps工具
- 单片机初学者做项目为什么这么难?单片机初学者心得有哪些
- 3加2大专计算机专业考什么,3加2学校有什么专业 初中生怎么报考3+2