HDU 1285 确定比赛名次——拓扑排序
2013-08-09 10:27
288 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1285
解题过程:
第1道拓扑排序题,值得纪念一下。
这个题目错了很多次。
开始用的是深搜,给每个节点一个权值,叶子节点的权值是1,父亲节点的权值是孩子节点的最大值+1。
在遍历完整个图之后,按照权值从大到小进行排序,就能得到一个拓扑排序。
但是这个排序很难满足题目的条件,就是ID小的放在前面,所以WA了。
后来用那种最传统的写法,确定每个顶点的度数,然后取出度数为0的点,接着删除与之相邻的边。
一直这样重复下去。
本来以为这样是对的,但是我的做法不是每次取一个度数为0的点,而是取了一堆度数为0的点。
这样就不能保证ID从小到大的排序了。
正解:
确定每个顶点的度数,从小到大去寻找度数为0的点k,找到之后就将它放入最后的输出结果中。
然后标记k的度数为-1,同时删除将与k相邻的点的度数-1。
重复上述步骤,就能得到最终解。
源代码:
http://acm.hdu.edu.cn/showproblem.php?pid=1285
解题过程:
第1道拓扑排序题,值得纪念一下。
这个题目错了很多次。
开始用的是深搜,给每个节点一个权值,叶子节点的权值是1,父亲节点的权值是孩子节点的最大值+1。
在遍历完整个图之后,按照权值从大到小进行排序,就能得到一个拓扑排序。
但是这个排序很难满足题目的条件,就是ID小的放在前面,所以WA了。
后来用那种最传统的写法,确定每个顶点的度数,然后取出度数为0的点,接着删除与之相邻的边。
一直这样重复下去。
本来以为这样是对的,但是我的做法不是每次取一个度数为0的点,而是取了一堆度数为0的点。
这样就不能保证ID从小到大的排序了。
正解:
确定每个顶点的度数,从小到大去寻找度数为0的点k,找到之后就将它放入最后的输出结果中。
然后标记k的度数为-1,同时删除将与k相邻的点的度数-1。
重复上述步骤,就能得到最终解。
源代码:
#include<stdio.h> #include<stdlib.h> #include<string> #include<cmath> #include<vector> #include<map> #include<iostream> #include<algorithm> using namespace std; int s[505][505]; int n,m; int degree[505]; //表示每个点的度数 int key[505]; void order() { int i,j,k,t; //求出每个点的度数 memset(degree,0,sizeof(degree)); memset(key,0,sizeof(key)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(s[i][j]) degree[j]++; for(i=1;i<=n;i++) //求取第i个点 { k=1; while(degree[k]!=0) k++; key[i]=k; degree[k]=-1; for(j=1;j<=n;j++) if(s[k][j]) degree[j]--; } return; } int main() { freopen("in.txt","r",stdin); int a,b,i; while(scanf("%d%d",&n,&m)==2) { memset(s,0,sizeof(s)); while(m--) { scanf("%d%d",&a,&b); s[a][b]=1; } order(); for(i=1;i<n;i++) printf("%d ",key[i]); printf("%d\n",key ); } return 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 确定比赛名次 拓扑排序
- hdu 1285 确定比赛名次(拓扑排序)
- HDU 1285-确定比赛名次(拓扑排序)