AtCoder AGC036D Negative Cycle (图论、DP)
题目链接
https://atcoder.jp/contests/agc036/tasks/agc036_d
题解
这都是怎么想出来的啊。。目瞪口呆系列。。
第一步转化至关重要: 一张图中不存在负环意味着什么?
不存在负环就存在最短路,我们可以给每个点分配一个权值\(p_i\)(相当于从\(1\)号到该点的最短路,点从\(1\)开始标号)满足对于任何边\((i,j)\)有\(p_j\ge p_i+w(i,j)\).
然后我们令\(q_i=p_i-p_{i+1}\), 那么由于边权都是\(1\)或者\(-1\)并且存在不能删的\(0\)边, 显然有\(q\)数组的值都是\(0\)或者\(1\).
约束变成了: 对于每条边\((i,j)\ (i>j)\)有\(\sum^{i-1}_{k=i}q_k\le 1\), 对于每条边\((i,j)\ (i<j)\)有\(\sum^{j-1}_{k=i}q_k\ge 1\).
所以问题就被转化成了: 你要给每个\(1\)到\((n-1)\)中的点\(q_i\)分配一个\(0\)或者\(1\)的权值,再删掉所有不满足约束条件的边,使得总代价最小!
天哪,这也太神仙了吧……
然后就是一个很容易的DP了,设\(dp[i][j]\)表示安排好前\(i\)位的\(q\)值,且强行令\(q_i=1\), 上一个为\(1\)的位置是\(j\)
那么考虑枚举\(k\), \(dp[i][j]\)转移到\(dp[k][i]\),同时删去不合法的边
对于\(a>b\)的边\((a,b)\), 要删掉所有满足\(j<b\le i<x<a\)的边
对于\(a<b\)的边\((a,b)\), 要删掉所有满足\(j<i<a<b\le x\)的边
然后这个很容易使用二维前缀和优化,时间复杂度\(O(n^3)\).
啊啊啊人类智慧……
代码
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
#define llong long long
using namespace std;inline int read()
{int x=0; bool f=1; char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=0;for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');if(f) return x;return -x;
}const int N = 500;
llong a[N+3][N+3];
llong s[2][N+3][N+3];
llong dp[N+3][N+3];
int n;void update(llong &x,llong y) {x = x<y?x:y;}llong getsum(int typ,int lx,int rx,int ly,int ry)
{return s[typ][rx][ry]-s[typ][lx-1][ry]-s[typ][rx][ly-1]+s[typ][lx-1][ly-1];
}int main()
{scanf("%d",&n);for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){if(j==i) continue;scanf("%lld",&a[i][j]);}}for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){if(i<j) {s[0][i][j] = a[i][j];}s[0][i][j] += s[0][i][j-1];}for(int j=1; j<=n; j++) s[0][i][j] += s[0][i-1][j];}for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){if(i>j) {s[1][i][j] = a[i][j];}s[1][i][j] += s[1][i][j-1];}for(int j=1; j<=n; j++) s[1][i][j] += s[1][i-1][j];}memset(dp,42,sizeof(dp)); dp[0][0] = 0ll;for(int i=0; i<=n; i++){for(int j=0; j<max(i,1); j++){for(int k=i+1; k<=n; k++){llong tmp = dp[i][j]+getsum(1,k+1,n,j+1,i)+getsum(0,i+1,k,i+1,k);update(dp[k][i],tmp);}}}llong ans = dp[n][1];for(int i=1; i<=n; i++) update(ans,dp[n][i]);printf("%lld\n",ans);return 0;
}
AtCoder AGC036D Negative Cycle (图论、DP)相关推荐
- AtCoder AGC030F Permutation and Minimum (DP、计数)
题目链接 https://atcoder.jp/contests/agc030/tasks/agc030_f 题解 首先序列里会有\(a_{2i-1}\)和\(a_{2i}\)都不为\(-1\)的情况 ...
- AtCoder AGC019E Shuffle and Swap (DP、FFT、多项式求逆、多项式快速幂)
题目链接 https://atcoder.jp/contests/agc019/tasks/agc019_e 题解 tourist的神仙E题啊做不来做不来--这题我好像想歪了啊= =-- 首先我们可以 ...
- atcoder A - Frog 1(DP)
A - Frog 1 Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement There a ...
- 【AtCoder - 4244 】AtCoder Express 2 (区间dp 或 暴力枚举,思维)
题干: In Takahashi Kingdom, there is a east-west railroad and N cities along it, numbered 1, 2, 3, ... ...
- Atcoder 077E - guruguru(线段树+dp)
题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_c 分析:如果某条线段包含x,显然应该先按一下到x,再从x走,反之必然是直接走过去,很容易想到用d ...
- 【QBXT】学习笔记——Day3/4图论+dp
继续上传一波笔记吧. Day3 1.16AM 今天讲图论,以习题为主. 开篇水题: 给一幅图,若删去一个点后变成一棵树,则这个点合法.问哪些点合法. 思路根据树的性质:这个点不是割点,m-这个点的度数 ...
- Atcoder dp_q Flowers 数据结构优化dp
文章目录 题意 题解 最近在练习atcoder上的dp场,大概只会做一半.我选出一些不会的题目写一下博客. 题意 按顺序每朵花有一个高度,一个美丽度,选出一个高度上升的子序列,求美丽度之和的最大值. ...
- AtCoder AGC043C Giant Graph (图论、SG函数、FWT)
题目链接 https://atcoder.jp/contests/agc043/tasks/agc043_c 题解 场上感觉没啥思路就放弃了,场下想了十几分钟发现是水题,血亏...(只能怪自己计数水平 ...
- AtCoder AGC033F Adding Edges (图论)
------------恢复内容开始------------ 题目链接 https://atcoder.jp/contests/agc033/tasks/agc033_f 题解 又被神仙题搞自闭了-- ...
最新文章
- 转发 DDoS攻防战 (一) : 概述
- [转载]C#模拟键盘鼠标事件-SendKeys
- java disjoint_java – Union Find算法的应用(Disjoint Set)
- LYNC2013部署系列PART4:群聊部署
- GCC for Win32开发环境介绍
- 一种页面数据错误输入提示方法 【转】
- centos7.6查看什么进程跑的流量_Spark的提交方式有哪些?有什么区别?
- 机器人softmove_ABB 工业机器人 SoftMove功能介绍
- excel文件打不开怎么办_电脑设备管理器打不开怎么办
- 开课吧:深入了解C++和C语言的血缘关系
- 中信所怎么查期刊影响因子_中华细胞与干细胞杂志影响因子
- 一款简洁的税后工资计算器(2019)
- 介绍中国传统节日的网页html,介绍中国传统节日
- Hadoop高手之路1—Hadoop简介
- 使用计算机制作数字文本格式,电脑excel表格如何将文本格式变成数字格式
- 6款超实用微信小程序,任何手机都需要!
- 2022圣诞节用canvas实现流星雨
- 参加“灵狐公司”的技术年会,感受最新MS OFFICE 2007的应用价值!
- 炫酷 RGB 之.NET nanoFramework 点灯大师
- 招投标的具体流程是什么?
热门文章
- php5 函数,2017PHP5函数大全
- 等值连接_sql高阶教程:非等值自连接
- row间距 table 某一行_UITableview的一个section下的各行Row之间可以设置间隔一段距离吗?...
- [scala-spark]3. 变量 数据类型 分支与循环
- 探究Java常量本质及三种常量池(JVM)
- java transient关键字
- PM2.5检测 -- PMS7003 采集和 MQTT 传输
- 高一计算机专业用平板电脑,高中生需不需要平板电脑或者笔记本电脑?
- Java变量的作用域
- 以太坊智能合约安全 Dasp Top10