QYQ在艾泽拉斯

题目大意

给你一个有向图,然后定义一个区域是将有向边看做无向边所形成的连通块。
然后你可以选 K+1 个区域,从任意点出发走到任意点。
然后点有点权,要你最大化点权和。

思路

看到有向图走路径要点权最大,不难想到 Tarjan 缩点之后跑拓扑序 DP。

然后看到它说有区域之分,那你就用并查集搞出来每个区域。
然后要选 K+1 个区域,那你就对于每个预期都跑出结果,然后把结果排序,选最优的前面的几个。

然后就好了。

代码

#include<queue>
#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>using namespace std;struct node {int to, nxt;
}e[1000001], e_[1000001];
int n, m, fa[100001], x, y, tmp;
int le[100001], KK, dfn[100001];
int low[100001], sta[100001], K;
int in[100001], nn, a[100001], answer;
int sum[100001], le_[100001], KK_;
int du[100001], ans[100001], f[100001];
vector <int> jh[100001];
queue <int> q;bool cmp(int x, int y) {return x > y;
}void add(int x, int y) {e[++KK] = (node){y, le[x]}; le[x] = KK;
}void add_(int x, int y) {e_[++KK_] = (node){y, le_[x]}; le_[x] = KK_;du[y]++;
}int find(int now) {if (fa[now] == now) return now;return fa[now] = find(fa[now]);
}void connect(int x, int y) {int X = find(x), Y = find(y);if (X == Y) return ;fa[X] = Y;
}void tarjan(int now) {dfn[now] = low[now] = ++tmp;sta[++sta[0]] = now;for (int i = le[now]; i; i = e[i].nxt)if (!dfn[e[i].to]) tarjan(e[i].to), low[now] = min(low[now], low[e[i].to]);else if (!in[e[i].to]) low[now] = min(low[now], low[e[i].to]);if (dfn[now] == low[now]) {in[now] = ++nn;sum[nn] = a[now];jh[find(now)].push_back(nn);while (sta[sta[0]] != now) {in[sta[sta[0]]] = nn;sum[nn] += a[sta[sta[0]]];sta[0]--;}sta[0]--;}
}int main() {//  freopen("azeroth.in", "r", stdin);
//  freopen("azeroth.out", "w", stdout);scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++) fa[i] = i;for (int i = 1; i <= m; i++) {scanf("%d %d", &x, &y);add(x, y);connect(x, y);}for (int i = 1; i <= n; i++) scanf("%d", &a[i]);scanf("%d", &K);for (int i = 1; i <= n; i++)//缩点建新图if (!dfn[i]) tarjan(i);for (int i = 1; i <= n; i++)for (int j = le[i]; j; j = e[j].nxt)if (in[i] != in[e[j].to])add_(in[i], in[e[j].to]);for (int i = 1; i <= n; i++)if (jh[i].size()) {//每个连通块求答案ans[0]++;for (int j = 0; j < jh[i].size(); j++)//拓扑if (!du[jh[i][j]]) {q.push(jh[i][j]);f[jh[i][j]] = sum[jh[i][j]];}while (!q.empty()) {int now = q.front();q.pop();ans[ans[0]] = max(ans[ans[0]], f[now]);for (int i = le_[now]; i; i = e_[i].nxt) {f[e_[i].to] = max(f[e_[i].to], f[now] + sum[e_[i].to]);du[e_[i].to]--;if (!du[e_[i].to]) q.push(e_[i].to);}}}sort(ans + 1, ans + ans[0] + 1, cmp);for (int i = 1; i <= min(ans[0], K + 1); i++)//排序选前面几个answer += ans[i];printf("%d", answer);fclose(stdin);fclose(stdout);return 0;
}

QYQ在艾泽拉斯(并查集)(Tarjan)(拓扑序DP)相关推荐

  1. Jzoj P4253 QYQ在艾泽拉斯___强连通分量缩点+拓扑序dp

    题目大意: Q Y Q QYQ QYQ有 K K K次技能,每次可以从一个岛屿上闪现到另外一个岛屿上,每一个岛屿只能登上一次. Q Y Q QYQ QYQ能从任何一个城市开始旅程,也能在任何一个城市结 ...

  2. POJ2186——并查集+Tarjan算法求强连通分量

    算法讨论:这题陷阱比较多.首先,被所有牛欢迎,这说明所有的牛都要在一个连通图中,也就是将所给的边看成无向边的时候,所有点要在一个连通图中.这个我们用并查集来实现就可以了.强连通分量的求法就很简单了,正 ...

  3. tarjan+拓扑序+差分--2018.10.16模拟赛T2

    题目: 阿天住的城市有 n 个政府部门,这些部门之间用了 m 条有向路径 连接了起来.有趣的是,每过一天这些路径都会变换方向,也就是说, 偶数的日子和奇数的日子的图是不同的. 阿天在社保局工作,可惜他 ...

  4. hdu 1811 Rank of Tetris (并查集+拓扑排序)

    Problem - 1811 感觉这题的并查集以及拓扑排序并不难,但是做题的时候必须理解到矛盾(CONFLICT)与不确定(UNCERTAIN)直接的优先关系. 做这题的时候,构图什么的很简单,就是没 ...

  5. Leetcode 1436旅行终点站 拓扑排序 并查集与队列

    题目介绍 题目难度: easy 给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 ...

  6. [拓扑排序][DP][Tarjan][并查集]JZOJ 4253 QYQ在艾泽拉斯

    Description 在艾泽拉斯的无尽之海里,有着一群不为人知的由各个种族的冒险者统治的岛屿,这些岛屿都很庞大,足以在上面建造许多的城市,城市之间有一些单向道路连接. 有一天,QYQ无意中发现了这些 ...

  7. 【gmoj】 【tarjan】 【拓扑】 【并查集】 QYQ在艾泽拉斯

    [gmoj] [tarjan] [拓扑][并查集] QYQ在艾泽拉斯 题目 解题思路 因为可能出现环用tarjan缩点 再建一个新图 用按拓扑序跑一边DP 求出一个连通块中从哪个点跑出来的价值最大 k ...

  8. 2021.8.9【提高B组模拟1】T2 QYQ在艾泽拉斯(Tarjan强连通分量)(并查集)

    QYQ在艾泽拉斯 题目大意 输入样例 3 2 1 2 3 1 1 2 1 0 输出样例 4 样例说明: QYQ从3号点开始,走到2号点,最后走到1号点,结束旅程,共获得1+2+1=4价值的宝物 题目数 ...

  9. 【蓝桥杯官网试题 - 历届试题】发现环(dfs+并查集,或无向图tarjan判环,无向环,或拓扑排序)

    题干: 问题描述 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管理员 ...

最新文章

  1. 鸿蒙系统啥时候发布新手机,鸿蒙系统新手机面世还有多远?明年3月发布的华为P40可能搭载...
  2. 50 xen虚拟化技术基础、xen虚拟化技术进阶
  3. Exchange 2007 内存使用问题
  4. android创建avd,详解如何创建和使用AVD
  5. 英文读法_儿童英语学习-英文字母A
  6. linux查看tcp连接状态_Linux使用lsof查看打开的文件和网络连接
  7. 从容 IT 人生路,开发工具伴我行——“葡萄城 30 周年”征文
  8. REST framework(2)
  9. lnmp架构下,织梦二级域名访问m文件夹出现 500错误
  10. linux 进入rescue模式,一个简单小例子来说一下Rescue营救模式
  11. 八、高级依赖关系配置
  12. 北京的小伙伴,本周五阿里聚安全约你来玩
  13. Android--UI布局
  14. asterisk app命令中文翻译
  15. Android 高级学习心得及项目要点
  16. 3月9日 英语笔记-英标
  17. 关于拉格朗日对偶问题中对偶性的理解 (很有趣)
  18. Gradle下载及安装,配置IDEA
  19. SAP中常用SM系列事务代码总结
  20. Hive总结及常见语法

热门文章

  1. easyui布局自缩放这么易
  2. Python作用域总结
  3. html table边框隐藏,HTML table表格边框的控制详细说明
  4. 如何在Excel中插入一行
  5. PHPcms首页模板修改无效
  6. 专题一:简单搜索、深搜、广搜
  7. (网页设计+数据库增删查改)——课设展示
  8. 乐动力推手表管家:Android Wear的中国化之路
  9. 高通 ADSP sensor SSC
  10. java技术--单体架构