题意:给定一个N点M边的有向图,叫你加最多K条边,使得最小拓扑序最大.

思路:不是那么简单的题.  参照了别人的代码, 最后想通了.

贪心原则: 用两个单调队列维护, 第一个序列S1单增, 表示当前入度为0的点 ; 第二个序列S2单减,表示需要加边的点.

如果S1的最大值大于S2的最大值,则对其加边.

(通俗的说对于当前入度为0的点,  显然就是越小的点越需要加边,  但是我先不给它加边,  而是放到一个集合S2里,   然后遇到最大的点(不能被加边的点)来给S2的点加边.  然后可以想象, 越小的点,  加边得越晚 ,这样可以保证越小的点越被"藏得深".  然后最小拓扑可以达到最大

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
priority_queue<int>p;
priority_queue<int,vector<int>,greater<int> >q;
vector<int>G[maxn];
int cnt,ind[maxn];
int num,used,ans[maxn],a[maxn],b[maxn];
void del(int v){
ans[++num]=v;
for(int i=;i<G[v].size();i++) if(!--ind[G[v][i]]) q.push(G[v][i]);
if(q.empty()){
if(!p.empty()){
int c=p.top(); p.pop();
G[ans[num]].push_back(c);
a[++used]=ans[num]; b[used]=c;
del(c);
}
}
}
int main()
{
int N,M,K,u,v,i,j;
scanf("%d%d%d",&N,&M,&K);
for(i=;i<=M;i++){
scanf("%d%d",&u,&v);
G[u].push_back(v);
ind[v]++;
}
for(i=;i<=N;i++) if(!ind[i]) q.push(i);
while(!q.empty()){
if(K&&(q.size()>||(!p.empty()&&q.top()<p.top()))){
K--;
int c=q.top(); p.push(c); q.pop();
if(q.empty()){
int c=p.top(); p.pop();
G[ans[num]].push_back(c);
a[++used]=ans[num]; b[used]=c;
del(c);
}
}
else{
int c=q.top(); q.pop();
del(c);
}
}
return ;
}

Gym - 100801G: Graph (贪心+set+拓扑)(好题)的更多相关文章

  1. 贪心/构造/DP 杂题选做Ⅱ

    由于换了台电脑,而我的贪心 & 构造能力依然很拉跨,所以决定再开一个坑( 前传: 贪心/构造/DP 杂题选做 u1s1 我预感还有Ⅲ(欸,这不是我在多项式Ⅱ中说过的原话吗) 24. P5912 ...

  2. 贪心/构造/DP 杂题选做Ⅲ

    颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...

  3. HDU 5695 ——Gym Class——————【贪心思想,拓扑排序】

    Gym Class Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  4. Codeforces Gym 101190 NEERC 16 G. Game on Graph(博弈+拓扑)

    Gennady and Georgiy are playing interesting game on a directed graph. The graph has n vertices and m ...

  5. 洛谷 P4437 [HNOI/AHOI2018]排列(贪心+堆,思维题)

    题面传送门 开始 WA ycx 的遗产(bushi 首先可以将题目转化为图论模型:\(\forall i\) 连边 \(a_i\to i\),然后求图的一个拓扑序 \(b_1,b_2,\dots b_ ...

  6. Codeforces Gym 100803C Shopping 贪心

    Shopping 题目连接: http://codeforces.com/gym/100803/attachments Description Your friend will enjoy shopp ...

  7. codeforces Gym 100187L L. Ministry of Truth 水题

    L. Ministry of Truth Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/p ...

  8. Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉

    Problem H. Hard TestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...

  9. 51Nod 1091 线段的重叠(贪心+区间相关,板子题)

    1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 2 ...

随机推荐

  1. js父页面和子页面之间传值

    今天和朋友一块讨论,怎样通过js在父页面和子页面之间传值的问题,总结例如以下: 需求描写叙述:父页面有多个子页面.实如今父页面点击子页面,传值到子页面. 看着非常easy,试了好久.主要纠结在怎样获取 ...

  2. [转]springmvc常用注解标签详解

    1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...

  3. 【BZOJ4269】再见Xor 高斯消元

    [BZOJ4269]再见Xor Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行一个正整 ...

  4. Android jni 编程(参数的传递,成员,方法的)相互访问

    package com.test.androidjni; import android.app.Activity; import android.os.Bundle; import android.u ...

  5. 怎样查看电脑登录过的wifi密码?

    https://jingyan.baidu.com/album/fcb5aff770f7e6edaa4a71d9.html?picindex=7

  6. php生成条形码: barcodegen

    实例结构: 1. index.html <!DOCTYPE html> <html> <head> <title>Test with embedded ...

  7. Notepad++ Tidy2 插件的核心配置

    在已有配置的基础上加上这四行: 以免符号被转换成HTML实体了 preserve-entities: yes quote-ampersand: yes quote-marks: no quote-nb ...

  8. zabbix server 端安装

    1.系统环境 [root@crazy-acong ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@crazy-acong ~] ...

  9. IE模式下背景图片不显示

    初衷是想给这个提交按钮<input type="submit" value=" />加上背景图片,用了以下css样式: .subtn input { back ...

  10. python基础-第五篇-5.2递归

    又是一个阳光明媚的日子,小白看着刚刚从东边升起的太阳,感觉太阳爷爷也在向她打招呼,小白就不经的微笑起来!心想:今天又会学到什么有趣的东西呢?有些小期待,也有些小激动! 小刘来得比小白还早,两辆相视而笑 ...