题目大意:中文
注释代码:
/*
* Problem ID : HDU 4857 逃生
* Author : Lirx.t.Una
* Language : C++
* Run Time : 218 ms
* Run Memory : 1324 KB
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <stack>
//最大点数
#define MAXN 30000
//最大边数
#define MAXM 1000000
//由于点数太多使用邻接表存
using namespace std;
//由于输入保证有解因此无需判环
//但是会有重边,因此算入读的时候会多算
//但是在进行拓扑排序的时候也会多拆点
//因此不影响最后结果
int head[MAXN + 1];
int to[MAXM + 1];
int nxt[MAXM + 1];
int e;
short deg[MAXN + 1];//入度,元素大小在MAXN范围内,用short保存
//要求多解情况下先考虑最前面的号码最小,因此连边的时候反向连
//拆点的时候从最大的拆
stack<short> ans;//因此结果的顺序和实际顺序相反,用栈存以便按照正确顺序输出
priority_queue<short> heap;//保存入度为0的点,让最大点排在堆顶
void
addarc( int u, int v ) {
deg[v]++;
to[e] = v;
nxt[e] = head[u];
head[u] = e++;
}
void
topsort(int n) {
int i;
int u;
for ( i = 1; i <= n; i++ )
if ( !deg[i] )
heap.push(i);
while ( !heap.empty() ) {
ans.push(u = heap.top());
heap.pop();
for ( i = head[u]; i; i = nxt[i] )
if ( !( --deg[ to[i] ] ) )
heap.push( to[i] );
}
printf("%d", ans.top());
ans.pop();
while ( !ans.empty() ) {
printf(" %d", ans.top());
ans.pop();
}
putchar('\n');
}
int
main() {
int t;
int n, m;//点数,边数
int u, v;
scanf("%d", &t);
while ( t-- ) {
memset(head, 0, sizeof(head));
scanf("%d%d", &n, &m);
e = 1;
while ( m-- ) {
scanf("%d%d", &v, &u);
addarc( u, v );//注意!!反向连边
}
topsort(n);
}
return 0;
}
无注释代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <stack>
#define MAXN 30000
#define MAXM 1000000
using namespace std;
int head[MAXN + 1];
int to[MAXM + 1];
int nxt[MAXM + 1];
int e;
short deg[MAXN + 1];
stack<short> ans;
priority_queue<short> heap;
void
addarc( int u, int v ) {
deg[v]++;
to[e] = v;
nxt[e] = head[u];
head[u] = e++;
}
void
topsort(int n) {
int i;
int u;
for ( i = 1; i <= n; i++ )
if ( !deg[i] )
heap.push(i);
while ( !heap.empty() ) {
ans.push(u = heap.top());
heap.pop();
for ( i = head[u]; i; i = nxt[i] )
if ( !( --deg[ to[i] ] ) )
heap.push( to[i] );
}
printf("%d", ans.top());
ans.pop();
while ( !ans.empty() ) {
printf(" %d", ans.top());
ans.pop();
}
putchar('\n');
}
int
main() {
int t;
int n, m;
int u, v;
scanf("%d", &t);
while ( t-- ) {
memset(head, 0, sizeof(head));
scanf("%d%d", &n, &m);
e = 1;
while ( m-- ) {
scanf("%d%d", &v, &u);
addarc( u, v );
}
topsort(n);
}
return 0;
}