HDU1285 确定比赛名次【拓普排序】
2016-07-11 14:07
246 查看
题目链接
前向星拓普排序。
前向星拓普排序。
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> #include<queue> #include<vector> using namespace std; #define V 1000 //前向星结构体 struct node { int v; //记录队伍编号 int next; }; node edge[V*4]; int head[V],deg[V]; int cnt; //记录下标 void topsort(int n){ priority_queue<int,vector<int>,greater<int> >que; //查找所有点 for(int i=1;i<=n;i++){ if(deg[i]==0){ que.push(i); deg[i]=-1; } } int k=1; while(que.empty()==false){ int u=que.top(); que.pop(); printf("%d",u); if(k++==n)printf("\n"); else printf(" "); //查找与该点相连的点 for(int i=head[u];i!=-1;i=edge[i].next){ node e=edge[i]; deg[e.v]--; //如果该点入度为0,加入队列 if(deg[e.v]==0){ que.push(e.v); } } } } int main() { int n,m; int i; while(scanf("%d%d",&n,&m)!=EOF){ memset(head,-1,sizeof(head)); memset(deg,0,sizeof(deg)); cnt = 0; for(int k=0;k<m;k++){ int u,v; scanf("%d%d",&u,&v); //除去重边 for(i=head[u];i!=-1;i=edge[i].next){ if(edge[i].v==v){ break; } } if(i==-1){ deg[v]++; edge[cnt].v=v; edge[cnt].next=head[u]; head[u]=cnt++; } } topsort(n); } return 0; }
相关文章推荐
- TNS-12537 TNS-12560 TNS-00507 Linux Error: 29: Illegal seek
- xStream完美转换XML、JSON
- 数据压缩
- SDRAM control
- Android休眠唤醒和wakeup_source机制的使用(1)
- Win2000 DDK 附带例子概览(图解)
- UML类图几种关系的总结
- java重写(覆盖)的实现
- 为何Apache下.htaccess不起作用,Linux、Windows详解
- php内存管理机制、垃圾回收机制
- C语言中static关键词使用在函数外部和内部的疑惑
- CSV文件格式
- STC12C5A60S2单片机实现ISP自动下载
- Xshell个性化设置,解决Xshell遇到中文显示乱码的问题
- string、wstring、cstring、 char、 tchar、int、dword转换方法(转)
- 【莫比乌斯反演】BZOJ2920-YY的GCD
- CVE漏洞爬虫java代码依赖-TestNG
- mysql 优化
- Android图片压缩方法
- Qt学习之路(38): model-view架构