HDU 5195 DZY Loves Topological Sorting(线段树单点更新)
2015-03-31 20:16
477 查看
题意:
给定一个有向无环图,让你去掉p条边后找出字典序最大的一个拓扑排序数列解析:
因为我们要求最后的拓扑序列字典序最大,所以一定要贪心地将标号越大的点越早入队。我们定义点ii的入度为didi。假设当前还能删去kk条边,那么我们一定会把当前还没入队的di≤kdi ≤ k的最大的ii找出来,把它的didi条入边都删掉,然后加入拓扑序列。可以证明,这一定是最优的。
具体实现可以用线段树维护每个位置的di,在线段树上二分可以找到当前还没入队的di≤k的最大的i。于是时间复杂度就是O((n+m)logn)。
AC代码
[code]#include <cstring> #include <cstdio> #include <algorithm> #include <vector> #define ls o*2 #define rs o*2+1 using namespace std; const int INF = 0x3f3f3f3f; const int N = 1e5 + 10; vector<int> G ; int minv[N<<2], indeg ; int n, m, k; inline void maintain(int o) { minv[o] = min(minv[ls], minv[rs]); } void build(int o, int L, int R) { if(L == R) { minv[o] = indeg[L]; return; } int M = (L+R)/2; build(ls, L, M); build(rs, M+1, R); maintain(o); } int pos; void modify(int o, int L, int R) { if(L == R) { minv[o]--; return ; } int M = (L+R)/2; if(pos <= M) modify(ls, L, M); else modify(rs, M+1, R); maintain(o); } int ret; void query(int o, int L, int R) { if(L == R) { minv[o] = INF; ret = L; return ; } int M = (L+R)/2; if(minv[rs] <= k) query(rs, M+1, R); else query(ls, L, M); maintain(o); } void init() { memset(indeg, 0, sizeof(indeg)); for(int i = 0; i < n+5; i++) { G[i].clear(); } } void addEdge(int from, int to) { G[from].push_back(to); } void toposort() { vector<int> ans; build(1, 1, n); for(int i = 1; i <= n; i++) { query(1, 1, n); int u = ret; ans.push_back(u); k -= indeg[u]; for(int j = 0; j < G[u].size(); j++) { int v = G[u][j]; --indeg[v]; pos = v; modify(1, 1, n); } } printf("%d", ans[0]); for(int i = 1; i < ans.size(); i++) { printf(" %d",ans[i]); } puts(""); } int main() { int u, v; while(~scanf("%d%d%d", &n, &m, &k)) { init(); while(m--) { scanf("%d%d", &u, &v); addEdge(u, v); indeg[v]++; } toposort(); } return 0; }
相关文章推荐
- HDU 5195 DZY Loves Topological Sorting(线段树)
- 【HDU】5195-DZY Loves Topological Sorting(拓扑 + 线段树 + 贪心)
- hdu 5195 DZY Loves Topological Sorting(线段树)
- hdu 5195 DZY Loves Topological Sorting【拓扑排序+优先队列+邻接表】
- HDU 5195 DZY Loves Topological Sorting(优先队列)
- HDU 5195 DZY Loves Topological Sorting 拓扑排序
- hdu 5195 DZY Loves Topological Sorting 线段树+拓扑排序
- HDU 5195 - DZY Loves Topological Sorting
- HDU 5195 DZY Loves Topological Sorting
- hdu 5195 DZY Loves Topological Sorting
- Hdoj 5195 DZY Loves Topological Sorting 【拓扑】+【线段树】
- HDU 5195 DZY Loves Topological Sorting 拓扑序(贪心)
- HDU 5195 DZY Loves Topological Sorting (拓扑排序+线段树)
- hdu 5195 DZY Loves Topological Sorting && BestCoder Round #35
- HDU 5195 DZY Loves Topological Sorting
- HDU 5649 DZY Loves Sorting (二分 + 线段树)
- [线段树] hdu5195 DZY Loves Topological Sorting
- DZY Loves Topological Sorting (BC #35 hdu 5195 topsort+优先队列)
- hdu 5649 DZY Loves Sorting(二分+线段树)
- 【Best Coder】#35 DZY Loves Topological Sorting(线段树维护)