//拓扑排序裸题,题目要求按编号从小到大输出,要换一种思维去思考

//按照数据结构课本的算法,建立邻接表,用栈实现。初始化先将入度为0的顶点入栈,然后以栈顶顶点为准,先将栈顶顶点出栈输出它的信息,然后扫描它的邻接表,没找到一个弧头就将其入度减1,减1后判断该弧头是否入度为0,是的话就入栈。直到所有顶点都出栈那么就输出了一个拓扑序列。但是这样做不能保证编号从小到大输出

为了保证从小到大输出,要用“每次都从头来过”的思想,因为题目保证一定存在拓扑序列,所以对于n个点,一定输出n次,所有外循环是次数,找到了n次,输出n个点,然后每次找,都是按照编号从1找到n,所以内循环是对应顶点的编号,从1到n,从当找到一个顶点,还没有纳入拓扑序列并且入度为0,就输出这个顶点的信息,并且扫描它的邻接表,将所有的弧头的入度都减1,然后再从头找过

所以找了n次,从次都是从编号1到n地扫描所有顶点,这样就能保证拓扑序列的正确性,而且因为编号都是从小到大扫描的,那么保证了先输出了编号小的

//用数组来实现邻接表#include <stdio.h>
#include <string.h>
#define MAXN 510
#define MAXM 250100
bool g[MAXN][MAXN],vis[MAXN];  //g对应边集数组,体重可能有重复,vis记录那些顶点已经纳入序列
int u[MAXM],v[MAXM]; //保存弧u->v
int first[MAXN];  //对应每个顶点的邻接表的第一条弧的编号
int in[MAXN];     //对应每个顶点的入度
int nextt[MAXM];   //对应一条弧的下一弧的编号
int n,m;void input()
{int i,j,k;memset(first , -1, sizeof(first));memset(in,0,sizeof(in));memset(g,0,sizeof(g));for(i=0; i<m; i++)  //对应m条弧
    {scanf("%d%d",&u[i] , &v[i]);if(g[u[i]][v[i]])  continue;g[u[i]][v[i]]=1;in[v[i]]++ ;nextt[i]=first[u[i]];first[u[i]]=i;}return ;
}
/*
void print_graph()
{int i,j,k,t;for(i=1; i<=n; i++)  //对应图的n个顶点,是从1开始标号的{printf("顶点%d:",i);k=first[i];  //得到这个顶点的第一条弧while(k!=-1){printf(" %d",v[k]);k=nextt[k];}printf("另外入度为%d\n",in[i]);}return ;
}
*/
void topsort()
{int i,j,k,t,f;memset(vis , 0 ,sizeof(vis));for(f=0,i=1; i<=n; i++)  //从头找n次,输出全部n个顶点
    {for(j=1; j<=n; j++)  //对应n个顶点的标号if(!vis[j] && in[j]<=0)  //zhe点还没有输出,而且这个点的入度为0,那么就是要输出这个点break;vis[j]=1;if(!f)  printf("%d",j) , f=1;else    printf(" %d",j);t=first[j];   //找到第j个顶点的邻接表,找到它的第1条弧while(t!=-1){k=v[t];   //找到弧头元素in[k]--;  //弧头元素的入度减1t=nextt[t];   //第k条弧的下一条弧j
        }}printf("\n");return ;
}
int main()
{while(scanf("%d%d",&n,&m)!=EOF){input(); //输入,建图
//        print_graph();
        topsort();}return 0;
}

转载于:https://www.cnblogs.com/scau20110726/archive/2012/10/16/2726996.html

hdu 1285 确定比赛名次相关推荐

  1. HDU 1285 确定比赛名次 拓扑排序(邻接矩阵 邻接表

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

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

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

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

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

  4. HDU 1285--确定比赛名次【拓扑排序 amp;amp; 邻接表实现】

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

  5. 拓扑排序杭电 1285确定比赛名次

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

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

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

  7. 杭电1285确定比赛名次

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

  8. HDOJ -- 1285 确定比赛名次

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

  9. hdu 1258 确定比赛名次

    有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道 ...

最新文章

  1. mysql 主从 怎么 升级_MySQL详解主从(主库升级).doc
  2. 全球十大AI训练芯片大盘点:华为昇腾910是中国唯一入选
  3. python不同层级模块的导入和文件的读写
  4. Java连接数据库(2)
  5. 5分钟搞定AlertManager接入短信、语音等10+种通知渠道
  6. PHP文字游戏源码寻仙纪
  7. xcom2.0_发布Xcom 2,Elliot Quest,Mesa图形库以及更多开放式游戏新闻
  8. python检测特定颜色的形状_python opencv 检测特定颜色
  9. 用上帝视角来看待组件的设计模式
  10. rpm mysql配置文件_redhat linux rpm包安装配置mysql数据库
  11. 中文版modbus测试软件,Modbus调试工具
  12. Matlab画直线、圆、球
  13. 以后不该吃的不能吃了。。。
  14. html标签各属性之间用空格隔开对吗,03-HTML标签(二)
  15. python gui测试工具_GitHub - Github-Benjamin/LeChu: Python GUI工具 二次开发
  16. php dingo和jwt,Laravel5.5+dingo+JWT 开发后台 API
  17. /proc/cpuinfo参数说明查看CPU参数
  18. 关于姓氏的一些全国分布情况的统计与分析
  19. 如何清洁你脏兮兮的笔记本电脑?
  20. Linux只读文件系统

热门文章

  1. 开源的“谷歌AutoML杀手”来了
  2. 微软总裁呼吁:AI刷脸,美国政府该管一管了
  3. Neuralink新动作:在洛杉矶开设动物实验中心
  4. C语言 文件操作| 文件关闭 |文件写入 |文件读取
  5. java中53个关键字的意义及使用方法
  6. Django后端项目----restful framework 认证源码流程
  7. 阿里云成为MariaDB基金会白金会员 全球唯一入选云计算公司
  8. The Future of Compass ElasticSearch
  9. vrrp协议原理与应用
  10. jQuery 第三章