hdu 1285 确定比赛名次
来源:互联网 发布:淘宝开内衣店店铺简介 编辑:程序博客网 时间:2024/05/20 17:41
主题思想: 拓扑排序。 拓扑排序的方法:1. 根据顶点入度进行计算,首先选取入度为0的节点,然后,去掉入度为0的顶点以及它出发的所有边。直到所有找到所有顶点。
2.还有一种dfs的方法,根据dfs完成的顺序,把先完成的节点加入栈,最后出栈就是拓扑排序序列,即拓扑排序序列与dfs先完成的节点顺序相反。
对于本题,我采用第一种方法。本题应采用邻接表表示图,并且记录已经输入的边,如果重复,则不再增加入度。题目还有一个特殊要求就是,如果有多个序列,下标小的在前。
因此采用找个一个入度为0的节点,删除它的所有边,就停止继续查找入度为0的节点,而是从1开始查找入度为0的节点,因此保证下标小的,首先被处理。
AC代码:
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int maxn=505;vector<int> g[maxn];int indegree[maxn];int mark[maxn][maxn];vector<int> ans;void TopSort(int n){ ans.clear(); while(ans.size()<n){ for(int j=1;j<=n;j++){ if(indegree[j]==0){ ans.push_back(j); if(ans.size()==n) break; indegree[j]=-100; int len=g[j].size(); for(int k=0;k<len;k++){ indegree[g[j][k]]--; } //here is important because need ensure that the index is smaller is at front break; } } }}int main(){ int n,m; int a,b; //init while(scanf("%d%d",&n,&m)!=EOF){ memset(mark,0,sizeof(mark)); for(int i=0;i<maxn;i++)g[i].clear(); memset(indegree,0,sizeof(indegree)); for(int i=0;i<m;i++){ scanf("%d%d",&a,&b); if(!mark[a][b]){ mark[a][b]=1; g[a].push_back(b); indegree[b]++; } } TopSort(n); printf("%d",ans[0]); int len=ans.size(); for(int i=1;i<len;i++){ printf(" %d",ans[i]); } printf("\n"); } return 0;}
阅读全文
0 0
- HDU 1285 确定比赛名次
- hdu 1285 确定比赛名次
- HDu 1285 确定比赛名次
- hdu 1285 确定比赛名次
- hdu 1285 确定比赛名次
- hdu 1285 确定比赛名次
- hdu 1285 确定比赛名次
- hdu 1285 确定比赛名次
- HDU-1285-确定比赛名次
- hdu 1285 确定比赛名次
- hdu 1285 确定比赛名次
- hdu 1285 确定比赛名次
- Hdu 1285 确定比赛名次
- HDU 1285 确定比赛名次
- HDU 1285 确定比赛名次
- hdu 1285 确定比赛名次
- HDU 1285 确定比赛名次
- HDU - 1285 确定比赛名次
- MySQL 修改数据表-添加删除列
- 回顾大一·C语言编程2.3(6)
- 自动化测试 之 “好用例、坏用例”
- asp.net控件GridView入门基础
- 自我参考-Java基础
- hdu 1285 确定比赛名次
- 设置滚动条样式
- 最长上升子序列
- ofbiz学习——ecommerce项目主页面
- 人群密度分析学习之路
- 已知两点坐标和半径求圆心坐标程序C++
- linux安装mongodb
- 三栏结构布局技巧
- 人群分析--ResnetCrowd: A Residual Deep Learning Architecture