网站建设图书,好看网站手机版,网页优化建议,wordpress去水印插件n个数#xff0c;已经有大小关系#xff0c;现给m个约束#xff0c;规定a在b之前#xff0c;剩下的数要尽可能往前移。输出序列 大小关系显然使用拓扑结构#xff0c;关键在于n个数本身就有大小关系#xff0c;那么考虑反向建图#xff0c;优先选择值最大的入度为零的点…n个数已经有大小关系现给m个约束规定a在b之前剩下的数要尽可能往前移。输出序列 大小关系显然使用拓扑结构关键在于n个数本身就有大小关系那么考虑反向建图优先选择值最大的入度为零的点这样得到的序列就是从大到小的最后倒序输出就行了。 写这题的时候头好痛阿肚子好痛阿再也不想熬夜了一点效率都没有。 /** Date : 2017-09-29 19:29:12* FileName: HDU 4857 拓扑排序 优先队列.cpp* Platform: Windows* Author : Lweleth (SoungEarlfgmail.com)* Link : https://github.com/* Version : $Id$*/
#include bits/stdc.h
#define LL long long
#define PII pairint ,int
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std;const int INF 0x3f3f3f3f;
const int N 1e520;
const double eps 1e-8;int deg[30010];
vectorintedg[30010];
int ans[30010];
int top(int n)
{priority_queueint, vectorint, lessint q;for(int i 1; i n; i)if(deg[i] 0/* edg[i].size() 0*/)q.push(i);int cnt 0;while(!q.empty()){int nw q.top();q.pop();for(auto i: edg[nw]){deg[i]--;if(deg[i] 0)q.push(i);}ans[cnt] nw;}/*for(int i 1; i n; i)if(deg[i] 0) ans[cnt] i;*/return cnt;
}int main()
{int T;cin T;while(T--){int n, m;scanf(%d%d, n, m);for(int i 0; i n; i)edg[i].clear();MMF(deg);for(int i 0; i m; i){int x, y;scanf(%d%d, x, y);int size edg[y].size();edg[y].emplace_back(x);if(size ! edg[y].size())deg[x];}int cnt top(n);for(int i cnt - 1; i 0; i--)printf(%d%s, ans[i], i0?\n: );}return 0;
}转载于:https://www.cnblogs.com/Yumesenya/p/7612740.html