邻接表拓扑排序,保证从小到大输出(未测试)
2016-06-27 16:53
274 查看
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
const int N=100009;
int head
,tot,pre
,edge
,n,m,b
,cnt
,a
;
void add(int x,int y)
{
edge[++tot]=y;pre[tot]=head[x];head[x]=tot;
}
int main()
{
scanf("%d%d",&n,&m);
int x,y;
while (m--)
{
scanf("%d%d",&x,&y);
cnt[y]++;
add(x,y);
}
priority_queue<int,vector<int>,greater<int> > q;
for (int i=1;i<=n;i++) if (cnt[i]==0) q.push(i);
int z=0;
while (!q.empty())
{
int u=q.top();
q.pop();
a[u]=++z;
for (int i=head[u];i;i=pre[i])
{
int v=edge[i];
cnt[v]--;
if (cnt[v]==0) q.push(v);
}
}
for (int i=1;i<=n;i++) printf("%d ",a[i]);
return 0;
}
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
const int N=100009;
int head
,tot,pre
,edge
,n,m,b
,cnt
,a
;
void add(int x,int y)
{
edge[++tot]=y;pre[tot]=head[x];head[x]=tot;
}
int main()
{
scanf("%d%d",&n,&m);
int x,y;
while (m--)
{
scanf("%d%d",&x,&y);
cnt[y]++;
add(x,y);
}
priority_queue<int,vector<int>,greater<int> > q;
for (int i=1;i<=n;i++) if (cnt[i]==0) q.push(i);
int z=0;
while (!q.empty())
{
int u=q.top();
q.pop();
a[u]=++z;
for (int i=head[u];i;i=pre[i])
{
int v=edge[i];
cnt[v]--;
if (cnt[v]==0) q.push(v);
}
}
for (int i=1;i<=n;i++) printf("%d ",a[i]);
return 0;
}
相关文章推荐
- js/jq 键盘上下左右回车按键
- mapreduce
- 我的第一份HTML简历
- Spring MVC jsonp跨域调用 中文乱码问题处理
- Tableau自定义分类调色板
- Maven总结
- [置顶] Flex 布局教程:语法篇
- 关于bootstrap--排版(标题、强调、背景、插入符等)
- 第一个只出现一次的字符串
- 008-大整数乘法-分治法-《算法设计技巧与分析》M.H.A学习笔记
- 用currentColor做主题色
- QT 实现固定大小圆形进度条
- Android 软键盘--的控制
- 牛客网-直通BAT面试算法精品课购买优惠码
- [置顶] Flex 布局教程:实例篇
- vs快捷键2
- Servlet实现定时刷新到另外一个页面response.setHeader("refresh", "3;url=/...")
- CSS 补充
- radio选中
- bzoj1093(强联通分量+缩点+dp记忆化搜索(算是乱搞找方法吧!))