hdu1285-拓扑排序
2017-04-21 18:00
169 查看
题目意思就是只告诉你两两之间谁赢了,让你按照字典序排序。
由题意,可以在稿纸上画成一个树,这时就容易想到用拓扑排序来做了。
拓扑排序的思想是:
(1)从有向图中选取一个没有前驱(入度为0)的顶点,并输出;
(2)从有向图中删去此顶点;
重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。
这道题数据量不大,可以不用建树,或者优先队列什么的来做,直接二位数组模拟也能过,time 124ms。
由题意,可以在稿纸上画成一个树,这时就容易想到用拓扑排序来做了。
拓扑排序的思想是:
(1)从有向图中选取一个没有前驱(入度为0)的顶点,并输出;
(2)从有向图中删去此顶点;
重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。
这道题数据量不大,可以不用建树,或者优先队列什么的来做,直接二位数组模拟也能过,time 124ms。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int M = 1005; int a[M][M]; int main() { int n,m,p1,p2; while(scanf("%d%d",&n,&m) != EOF) { memset(a,0,sizeof(a)); for(int i=0; i<m; i++) { scanf("%d%d",&p1,&p2); if(a[p1][p2] == 0) { a[p1][p2] = 1; a[p2][p2]++; //表示有几个入度 } } for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(a[j][j] == 0) //表示入度为0,打印后删掉 { a[j][j] = -1; for(int k=1; k<=n; k++) { if(a[j][k]==1 && k != j)//以j为入度的-1 a[k][k]--; } printf("%d",j); break;//退出 使每次输出都符合字典序 } } if(i != n) printf(" "); } printf("\n"); } return 0; }
相关文章推荐
- HDU1285确定比赛名次(拓扑排序)
- hdu1285 确定比赛名次(拓扑排序)
- hdu1285(拓扑排序)
- 拓扑排序 HDU1285
- hdu1285(拓扑排序)
- hdu1285(图,拓扑排序)
- hdu1285(拓扑排序)
- 图论之初,拓扑排序、前向星(通过存储边来存储图)加优先队列对拓扑的优化-----hdu1285
- HDU1285(拓扑排序(模板))
- hdu1285(邻接矩阵写拓扑排序)
- hdu1285 确定比赛名次(拓扑排序)
- HDU1285-拓扑排序
- HDU1285 确定比赛名次 解题报告--拓扑排序
- HDU1285 确定比赛名次(拓扑排序)
- hdu1285 确定比赛名次(拓扑排序)
- hdu1285(拓扑排序)
- 确定比赛名次---hdu1285(拓扑排序)
- hdu1285 确定比赛名次【拓扑排序】
- 确定比赛名次---HDU1285(拓扑排序)
- [hdu1285]拓扑排序模板 邻接表加优先队列简单易懂