您的位置:首页 > 其它

HDU 1285 确定比赛名次

2016-04-20 09:37 267 查看
拓扑排序。我直接就按照拓扑排序的定义写的,因为要小号在前面,所以用到了小顶堆,因为格式错误,WA了一次。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>

using namespace std;
const int MAX = 505;
int cnt[MAX];
int res[MAX];
int flag[MAX];
vector<int> v[MAX];
//queue<int> ans;

int main()
{
int n, m;
priority_queue<int, vector<int>, greater<int> > ans;
while (scanf("%d%d", &n, &m) != EOF)
{
int from, to;
int tmp_cnt = 0;
memset(cnt, 0, sizeof(cnt));
memset(res, 0, sizeof(res));
memset(flag, 0, sizeof(flag));
// ans.clear();
for (int i = 1; i <= n; ++i)
v[i].clear();
for (int i = 0; i < m; ++i)
{
scanf("%d%d", &from, &to);
cnt[to]++;
v[from].push_back(to);
}
for (int i = 1; i <= n; ++i)
{
if (cnt[i] == 0)
{
ans.push(i);
//res[tmp_cnt++] = i;
//flag[i] = 1;
//cout << "i = " << i << endl;
//break;
}
}

//cout << ans.top() << endl;
while (!ans.empty())
{
int tmp_v = ans.top();
//cout << "during the while loop " << ans.top() << endl;
if (!flag[tmp_v])
res[tmp_cnt++] = tmp_v;
flag[tmp_v] = tmp_v;
ans.pop();
int lenth = v[tmp_v].size();
for (int i = 0; i < lenth; ++i)
{
if (--cnt[v[tmp_v][i]] == 0)
{
ans.push(v[tmp_v][i]);
//cout << "v[tmp_v][i] = " << v[tmp_v][i] << endl;
}
}
}
//cout << "tmp_cnt = " << tmp_cnt << endl;
for (int i = 0; i < tmp_cnt - 1; ++i)
printf("%d ", res[i]);
printf("%d\n", res[tmp_cnt - 1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: