文章目录

  • 题意
  • 思路
  • 代码

题意

我不会的都是好题。

一张连通的图,有k(k≤20)k(k\le 20)k(k≤20)个点被点燃了。每条边有一个权值表示从一个点烧到另一个点需要的时间。

现在可以选择一些点灭火,求有多少种灭火方案不会使烧完所有点的用总时间变长。

思路

正难则反,求可以使总时间边长的灭火方案。

kkk遍最短路,求出每个点uuu被某个钦定的点vvv烧到用的时间,记为dis[v][u]dis[v][u]dis[v][u]。

假如要使烧到uuu的时间大于原始的总时间,那么dis[v][u]≤max_disdis[v][u]\le max\_disdis[v][u]≤max_dis的所有点都必须灭火。由此,对于每一个点我们得到了一个最小的灭火集合,而所有包含这个集合的集合同样可以延长总时间,所以最后状压搞一搞就完事了。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL inf = 1e18 + 7;
const int N = 1e5 + 10, M = 4e5 + 10, K = 20;
const int mod = 998244353;
int n, m, k, a[K];
int h[N], ecnt, v[M], w[M], nxt[M];
struct node{int id; LL val;node(){}node(int x, LL y){id = x; val = y;}bool operator < (const node &u)const{return val > u.val;}
};
priority_queue<node> que;
LL dis[K][N], pd, ans;
int f[1<<K];template<class T>inline void read(T &x){x = 0; bool fl = 0; char c = getchar();while (!isdigit(c)){if (c == '-') fl = 1; c = getchar();}while (isdigit(c)){x = (x<<3)+(x<<1)+c-'0'; c = getchar();}if (fl) x = -x;
}void add(int _u, int _v, int _w)
{v[++ecnt] = _v; w[ecnt] = _w; nxt[ecnt] = h[_u];h[_u] = ecnt;
}inline int fpow(int x, int y, int p){int ret = 1;while (y){if (y & 1) ret = 1LL * ret * x % p;x = 1LL * x * x % p;y >>= 1;}return ret;
}LL solve(int sta, LL *dis)
{for (int i = 1; i <= n; ++ i)dis[i] = inf;for (int i = 0; i < k; ++ i)if ((sta >> i) & 1){que.push(node(a[i], 0));dis[a[i]] = 0;}while (!que.empty()){int u = que.top().id;LL d = que.top().val;que.pop();if (d > dis[u]) continue;for (int i = h[u]; i; i = nxt[i])if (dis[v[i]] > d + w[i]){dis[v[i]] = d + w[i];que.push(node(v[i], dis[v[i]]));}}LL ret = 0;for (int i = 1; i <= n; ++ i)if (ret < dis[i])ret = dis[i];return ret;
}int main()
{read(n); read(m); read(k);for (int i = 0; i < k; ++ i)read(a[i]);ecnt = 1;for (int i = 1; i <= m; ++ i){int x, y, z;read(x); read(y); read(z);add(x, y, z);add(y, x, z);}pd = solve((1<<k)-1, dis[0]);for (int i = 0; i < k; ++ i)solve(1 << i, dis[i]);memset(f, 0, sizeof(f));for (int i = 1; i <= n; ++ i){int now = 0;for (int j = 0; j < k; ++ j)if (dis[j][i] <= pd){now |= 1 << j;}f[now] = 1;}ans = fpow(2, k, mod);for (int i = 1; i < (1<<k); ++ i){for (int j = 0; j < k; ++ j)if ((i >> j) & 1)f[i] |= f[i ^ (1 << j)];ans -= f[i];}printf("%lld\n", ans * fpow(fpow(2, k, mod), mod-2, mod) % mod);return 0;
}

【香蕉oi】燃烧的火焰(最短路、状压)相关推荐

  1. YYHS-蜀传之单刀赴会(梦回三国系列T2)(最短路+状压dp)

    题目描述 [题目背景] 公元215年,刘备取益州,孙权令诸葛瑾找刘备索要荆州.刘备不答应,孙权极为恼恨,便派吕蒙率军取长沙.零陵.桂阳三郡.长沙.桂阳蜀将当即投降.刘备得知后,亲自从成都赶到公安(今湖 ...

  2. [2021-09-09 T3] 序列/luogu P3943 星空(异或差分+bfs最短路+状压dp)

    序列 description solution code description 题目描述 长度为nnn的序列,初始全为000,每次可以选择⼀个数ai(1≤i≤l)a_i(1\le i\le l)ai ...

  3. 牛客网 小白月赛4 D-郊区春游 最短路+状压dp

    链接: https://www.nowcoder.com/acm/contest/134/D来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  4. 牛客-十二桥问题【最短路,状压dp】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/1104/B 题目大意 nnn个点mmm条边的无向图,kkk条必须经过的边,求从1出发经过这kkk条边再回到1的 ...

  5. 洛谷P2761:软件补丁问题(状压、分层图最短路)

    当遇到瓶颈时,想想自己是否做了可以优化的无用功. 解析 不难想到状压最短路的做法. 但是直接加边的话边数会是 O(m2n)O(m2^n)O(m2n) 级别,只有 909090 分,难以通过. 注意到, ...

  6. 牛客 郊区春游 状压+最短路

    题目链接:郊区春游 思路:首先先用floyd求一下各个点之间的最短路,那么接下来就是找出一条最短路将R个点串起来.最简单的就是枚举每一种排列然后求最小值,那么时间复杂度就是15!,也就是1307674 ...

  7. [中国邮路问题 欧拉回路 最短路 一般图匹配||状压DP] FZU 1009 Jogging Trails

    论文:仇荣琦<欧拉回路性质与应用探究> 本来以为完全图匹配有什么高深的算法 结果去看参考资料里的论文就是带花树 汗 这道题n小 状压每个点的奇偶性 #include<cstdio&g ...

  8. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  9. loj 1316(spfa预处理+状压dp)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27024 题意:求0-(n-1)的经过最多的标记的点的最短路. 思路 ...

最新文章

  1. 初创公司面试要问什么_聘请初创公司的产品设计师时要问的问题
  2. 公司新来了个大神,一次分享他的 9 大技能
  3. 有关数据结构基础知识(数据结构 严蔚敏版)
  4. ASP.NET MVC应用程序实现下载功能
  5. Web服务器的配置与管理(2) 虚拟主机技术
  6. 第三方外部 Saas提供商如何跟使用 SAP 系统的客户进行对接接口集成
  7. 如何更改Windows 10锁定屏幕超时
  8. C#规范整理·泛型委托事件
  9. 获取两个数据的交集_MySQL交集和差集的实现方法
  10. python tkinter控件_Python3 tkinter基础 Label pack 设置控件在窗体中的位置
  11. wordpress模板-单栏整洁的个人博客Siren主题模板
  12. Shell排序(改良的插入排序)
  13. (六)数据处理——录入、清洗、加工、描述
  14. (BFS)uva2554-Snakes Ladders
  15. 28. 正确理解由reverse_iterator的base()成员函数所产生的iterator的用法
  16. 超好用的卸载工具——geek
  17. 婚宴座位图html5,婚宴座位安排图 婚宴主桌安排示意图
  18. token 微信access 过期_.Net微信开发之如何解决access_token过期问题
  19. python 股票交易接口 github_GitHub - xiongyixiaoyang/vnpy: 基于python的开源量化交易平台开发框架...
  20. 开机启动计算机时 屏幕无显示桌面,开机时电脑黑屏没有出现桌面怎么处理

热门文章

  1. 30句2018年精彩走心的文案,没事可以学习下,了解其中的文字意义
  2. word中的表格怎么按照章节自动插入题注(即表头的编号)
  3. 京东数科DevOps落地攻略
  4. 【信号系统实验2】MATLAB—连续时间信号与系统的频域分析
  5. 国家非专业等级计算机考试大纲,非计算机专业最新计算机等级考试大纲与试卷.doc...
  6. 新手焊接电路板_新手要如何熟练焊接电子电路板
  7. 学会自我管理有哪些好处?自我管理包括哪些内容?
  8. word里双横线怎么打_字体下方的双横线怎么弄 word蓝色双横线
  9. VMware虚拟机解决空间不足,增加磁盘空间(磁盘扩容)
  10. aero peek_如何在Windows中禁用Aero Peek