您的位置:首页 > 其它

hdu 1285 拓扑排序

2015-08-05 14:49 225 查看
简单的拓扑排序,要求字典序最小的话用优先队列来维护入度为0的点即可。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;

const int N = 501;
const int M = 10000;
int head
;
int ans
;
int in
;
int n, m, e;

struct Edge
{
int v, next;
} edge[M];

void addEdge( int u, int v )
{
edge[e].v = v;
edge[e].next = head[u];
head[u] = e++;
}

void topo()
{
priority_queue<int, vector<int>, greater<int> > q;
for ( int i = 1; i <= n; i++ )
{
if ( !in[i] ) q.push(i);
}
int cnt = 0;
while ( !q.empty() )
{
int u = q.top();
q.pop();
printf("%d", u);
cnt++;
if ( cnt != n ) putchar(' ');
else putchar('\n');
for ( int i = head[u]; i != -1; i = edge[i].next )
{
int v = edge[i].v;
in[v]--;
if ( in[v] == 0 )
{
q.push(v);
}
}
}
}

int main ()
{
while ( scanf("%d%d", &n, &m) != EOF )
{
e = 0;
memset( head, -1, sizeof(head) );
memset( in, 0, sizeof(in) );
while ( m-- )
{
int u, v;
scanf("%d%d", &u, &v);
addEdge( u, v );
in[v]++;
}
topo();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: