您的位置:首页 > 其它

hdu--1285 && 4857 --正向 || 逆向拓扑排序 && 优先队列

2014-08-11 19:35 239 查看
头太晕了 喝了太多 ..

就想提一点 对于 拓扑排序的这2题 为什么一个是正向 一个是逆向

主要是看题目要求 因为拓扑排序的结果总是有很多种存在的

一般来说 它会让你输出它指定要求的形式的答案

那么 如果是按字典序输出 就是 greater<int> 情况下的优先队列 并且 正向

  如果是尽量使小的数字 靠前输出 而不是追求 字典序 可以考虑 逆向拓扑 逆向输出

但 这些都不是唯一的 一定要分析好题目

曾经 看过一个讲动态规划的word 说拓扑是为DP作准备的 似乎有点道理

这两题 代码 实在太相像了 我都嫌丢人了..........

//逆向拓扑排序
#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;

int n;
const int size = 30010;
int in[size];
int arr[size];
vector<int>ve[size];
priority_queue<int,vector<int>,less<int> >q;

void init( )
{
for( int i = 1 ; i<=n ; i++ )
{
ve[i].clear();
in[i] = 0;
}
}

void topo( )
{
int cnt = 0;
for( int i = 1 ; i<=n ; i++ )
{
if( in[i] == 0 )
{
q.push(i);
}
}
while( !q.empty() )
{
int now = q.top();
q.pop();
arr[cnt++] = now;
for( int i = 0 ; i<ve[now].size() ; i++ )
{
int u = ve[now][i];
in[u] --;
if( in[u] == 0 )
{
q.push(u);
}
}
}
for( int i = cnt-1 ; i>=1 ; i-- )
{
cout << arr[i] << " ";
}
cout << arr[0] << endl;
}

int main()
{
cin.sync_with_stdio(false);
int t , m , x , y;
cin >> t;
while( t-- )
{
cin >> n >> m;
init( );
while( m-- )
{
cin >> x >> y;
in[x] ++;
ve[y].push_back(x);
}
topo();
}
return 0;
}


View Code

today:

  一年之前 我喝醉了 你陪我去南湖边吹风

  一年之后 我喝醉了 我陪他们去ktv .....  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: