您的位置:首页 > 其它

逃生 (hdu 4857 拓扑排序+优先队列)

2017-07-23 15:43 330 查看


逃生


Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)


Problem Description

糟糕的事情发生啦,现在大家都忙着逃命。但是逃命的通道很窄,大家只能排成一行。

现在有n个人,从1标号到n。同时有一些奇怪的约束条件,每个都形如:a必须在b之前。

同时,社会是不平等的,这些人有的穷有的富。1号最富,2号第二富,以此类推。有钱人就贿赂负责人,所以他们有一些好处。

负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,如果此时还有多种情况,就再让2号尽量靠前,如果还有多种情况,就让3号尽量靠前,以此类推。

那么你就要安排大家的顺序。我们保证一定有解。

 

Input

第一行一个整数T(1 <= T <= 5),表示测试数据的个数。 然后对于每个测试数据,第一行有两个整数n(1 <= n <= 30000)和m(1 <= m <= 100000),分别表示人数和约束的个数。 然后m行,每行两个整数a和b,表示有一个约束a号必须在b号之前。a和b必然不同。

 

Output

对每个测试数据,输出一行排队的顺序,用空格隔开。

 

Sample Input

1
5 10
3 5
1 4
2 5
1 2
3 4
1 4
2 3
1 5
3 5
1 2

 

Sample Output

1 2 3 4 5

 

//拓扑排序(优先队列实现)模板

(vector是个容器,相当于一个邻接表)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;

const int MAX = 30000 + 100;

int n;
int cnt;
int ans[MAX];
vector<int>map[MAX];
int indegree[MAX];
priority_queue<int>q;

struct cmp{
bool operator()(int &a, int &b) {
return a < b;
}
};

void toposort()
{
cnt = 0;
for (int i = 1; i <= n; i++)
{
if (!indegree[i])
q.push(i);
}
while (!q.empty())
{
int v = q.top();
q.pop();
for (int i = 0; i < map[v].size(); i++)
{
int u = map[v][i];
indegree[u]--;
if (!indegree[u])
q.push(u);
}
ans[cnt++] = v;
}
}

int main()
{
int T;
int m;
scanf("%d", &T);
while (T--)
{
int a, b;
scanf("%d%d", &n, &m);
memset(indegree, 0, sizeof(0));
memset(ans, 0, sizeof(ans));
for (int i = 0; i <= n; i++)
map[i].clear();
while (!q.empty())
q.pop();
for (int i = 0; i < m; i++)
{
scanf("%d%d", &a, &b);
map[b].push_back(a);
indegree[a]++;
}
toposort();
for (int i = cnt - 1; i > 0; i--)
printf("%d ", ans[i]);
printf("%d\n", ans[0]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: