[Codeforces 147B Smile House] DP+倍增+二分
来源:互联网 发布:网络舆论的传播分析 编辑:程序博客网 时间:2024/06/08 17:27
[Codeforces 147B Smile House] DP+倍增+二分
1. 题目链接
[Codeforces 147B Smile House]
2. 题意描述
给定顶点数为
3. 解题思路
首先对无向图进行如下预处理:
- 给每个顶点添加一条边(自环),指向自己;
- 对于原图没有指定的边,我们统统认为它的权值为
−∞ .
这样处理之后,我们就可以对答案进行二分了。
很容易想到,比较朴素的DP是用
采用倍增的思想,令dp[s][i][j]表示从
然后对答案进行二分,如何判断经过
首先,将
4. 实现代码
#include <bits/stdc++.h>using namespace std;const int MAXN = 300 + 5;const int MBIT = 15 + 5;const int INF = 0x3f3f3f3f;int n, m, MT, dp[MBIT][MAXN][MAXN];int ans[2][MAXN][MAXN];inline void umax(int& a, const int &b) { a = max(a, b); }void init() { MT = (int)floor(log2((long double)n)); for(int s = 0; s <= MT; s++) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { dp[s][i][j] = -INF; } dp[s][i][i] = 0; } }}void clr(int z) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { ans[z][i][j] = -INF; } ans[z][i][i] = 0; }}bool check(int step) { int z = 0; clr(z); for(int s = 0; s <= MT; s++) { if(((step >> s) & 1) == 0) continue; z ^= 1; clr(z); for(int k = 1; k <= n; k++) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { umax(ans[z][i][j], ans[z ^ 1][i][k] + dp[s][k][j]); } } } } for(int i = 1; i <= n; i++) { if(ans[z][i][i] > 0) return true; } return false;}int main() {#ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin);#endif // ONLINE_JUDGE int u, v, a, b; while(~scanf("%d %d", &n, &m)) { init(); for(int i = 1; i <= m; i++) { scanf("%d %d %d %d", &u, &v, &a, &b); dp[0][u][v] = a, dp[0][v][u] = b; } for(int s = 1; s <= MT; s++) { for(int k = 1; k <= n; k++) { for(int i = 1; i <= n; i++) { if(dp[s - 1][i][k] == -INF) continue; for(int j = 1; j <= n; j++) { umax(dp[s][i][j], dp[s - 1][i][k] + dp[s - 1][k][j]); } } } } int lb = 2, ub = n + 1, mid; while(lb <= ub) { mid = (lb + ub) >> 1; if(check(mid)) ub = mid - 1; else lb = mid + 1; } if(lb >= n + 1) lb = 0; printf("%d\n", lb); } return 0;}
1 0
- [Codeforces 147B Smile House] DP+倍增+二分
- codeforces 147B Smile House
- 【Codeforces Testing Round #4】Codeforces 147B Smile House
- Codeforces 360B + Codeforces 689C ( 二分 + DP )
- 739B Codeforces Alyona and a tree 树上差分+二分(倍增)
- Codeforces Round #294 (Div. 2) E. A and B and Lecture Rooms(倍增LCA+树形DP)
- Codeforces 487B. Strip DP+线段树+二分
- Codeforces 602B Approximating a Constant Range 【dp + 二分】
- CodeForces 360 B.Levko and Array(二分+dp)
- 【玲珑杯 Round#13 B】 【倍增+二分】
- Codeforces 739B【树上倍增+差分】
- CodeForces 302B 二分
- CodeForces 600B 二分
- Codeforces 650B 二分
- Codeforces 580 B-----二分
- Codeforces 702B【二分】
- codeforces-760【B二分】
- Codeforces 760B (二分)
- MyBatis学习(五):MyBatis的一对一关联如何操作
- 从keystore(jks)文件中提取私钥
- Solr查询流程
- Mysql 问题总结
- Qt之操作Excel(2)
- [Codeforces 147B Smile House] DP+倍增+二分
- LeetCode 122. Best Time to Buy and Sell Stock II
- Golang官方如何支持加载动态库
- SSL JudgeOnline 1455——电子老鼠闯迷宫
- 简单ajax坑我好几次
- [编程题]蛇形矩阵
- 【李木华】算法与数据结构概述
- 数组和链表的区别
- C# 泛型类型参数的约束