【BZOJ3691】游行 最小可相交路径覆盖转化

因为C是不断变化的而且C是和点权相关和边权无关 所以我们可以MCMF但是MCMF的时候不能与C相关
再分析问题 我们可以认为每条路径S->T只覆盖T这个终点 因为题目中说了如果Si != Ti 要多付出 C的代价
假设我们走过的路径形成了一个环则刚好 边数=点数 覆盖完了
如果走过的路径不是一个环 则还有起点没有覆盖 此时我们可以把它当作没有途径的城市 给他补偿 同样为C
所以我们把原图拆成左边出点 右边入点 传递闭包后建图
这样每次MCMF增广的代价是不递减的 并且每增广一次多覆盖一个点 所以我们把每次增广的代价放到一个数组里面
每次询问我们二分C在数组里的位置,在C之前的点我们利用路径覆盖 在C及C之后的点我们用C去补偿它
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 255
inline int read() {
int x = ;
bool t = false;
char ch = getchar();
while ((ch < '' || ch > '') && ch != '-')
ch = getchar();
if (ch == '-')
t = true, ch = getchar();
while (ch <= '' && ch >= '')
x = x * + ch - , ch = getchar();
return t ? -x : x;
}
int val[MAX], sum[MAX], tot;
namespace MCMF {
const int MAXM = , MAXN = ;
struct Line {
int v, next, w, fy;
} e[MAXM];
int h[MAXN], cnt = ;
inline void Add(int u, int v, int w, int fy) {
e[cnt] = (Line) {
v, h[u], w, fy
};
h[u] = cnt++;
e[cnt] = (Line) {
u, h[v], , -fy
};
h[v] = cnt++;
}
int dis[MAXN], pe[MAXN], pv[MAXN], Cost, Flow;
bool vis[MAXN];
queue<int> Q;
int S = , T = MAXN - ;
bool SPFA() {
memset(dis, , sizeof(dis));
dis[S] = ;
Q.push(S);
vis[S] = true;
while (!Q.empty()) {
int u = Q.front();
Q.pop();
for (int i = h[u]; i; i = e[i].next) {
int v = e[i].v;
if (!e[i].w)
continue;
if (dis[u] + e[i].fy < dis[v]) {
dis[v] = dis[u] + e[i].fy;
pe[v] = i, pv[v] = u;
if (!vis[v])
vis[v] = true, Q.push(v);
}
}
vis[u] = false;
}
if (dis[T] >= 1e9)
return false;
int flow = 1e9;
for (int i = T; i != S; i = pv[i])
flow = min(flow, e[pe[i]].w);
for (int i = T; i != S; i = pv[i])
e[pe[i]].w -= flow, e[pe[i] ^ ].w += flow;
Flow += flow;
Cost += dis[T] * flow;
val[++tot] = dis[T] * flow;
sum[tot] = sum[tot - ] + val[tot];
return true;
}
}
using namespace MCMF;
int n, m, q, g[MAX][MAX];
int main() {
n = read();
m = read();
q = read();
memset(g, , sizeof(g));
for (int i = ; i <= n; ++i)
g[i][i] = ;
for (int i = , u, v; i <= m; ++i)
u = read(), v = read(), g[u][v] = min(read(), g[u][v]);
for (int k = ; k <= n; ++k)
for (int i = ; i <= n; ++i)
for (int j = ; j <= n; ++j)
g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
for (int i = ; i <= n; ++i)
for (int j = ; j <= n; ++j)
if (i ^ j)
Add(i, j + n, , g[i][j]);
for (int i = ; i <= n; ++i)
Add(S, i, , ), Add(i + n, T, , );
while (SPFA());
while (q--) {
int C = read(), l = , r = tot, ret = ;
while (l <= r) {
int mid = (l + r) >> ;
if (val[mid] < C)
l = mid + , ret = mid;
else
r = mid - ;
}
printf("%d\n", sum[ret] + (n - ret)*C);
}
return ;
}
【BZOJ3691】游行 最小可相交路径覆盖转化的更多相关文章
- POJ 2594 Treasure Exploration 最小可相交路径覆盖
最小路径覆盖 DAG的最小可相交路径覆盖: 算法:先用floyd求出原图的传递闭包,即如果a到b有路径,那么就加边a->b.然后就转化成了最小不相交路径覆盖问题. 这里解释一下floyd的作用如 ...
- POJ2594 Treasure Exploration[DAG的最小可相交路径覆盖]
Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 8301 Accepted: 3 ...
- POJ 2594 Treasure Exploration(最小可相交路径覆盖)题解
题意:有n个点,m条单向边,每个机器人能沿着单向边走,能重复经过一个点,问最少几个机器人走遍n个点 思路:原来以前学的都是不能相交的算法....可相交的做法是跑Floyd把能到达的都加上边,然后跑最小 ...
- FJUT3591 侦测到在途的聚变打击(最小不可相交路径覆盖)题解
题意:给你n个点,点间m条路,给出在每条路要走的时间.现在有q个任务,要摧毁q个点,每次提供ci和ti表示在时间ti摧毁点ci(必须正好在时间ti才能摧毁),每个点可能需要多次摧毁(同一时间能在同一个 ...
- 有向无环图(DAG)的最小路径覆盖(转)
DAG的最小路径覆盖 定义:在一个有向图中,找出最少的路径,使得这些路径经过了所有的点. 最小路径覆盖分为最小不相交路径覆盖和最小可相交路径覆盖. 最小不相交路径覆盖:每一条路径经过的顶点各不相同.如 ...
- 有向无环图(DAG)的最小路径覆盖
DAG的最小路径覆盖 定义:在一个有向图中,找出最少的路径,使得这些路径经过了所有的点. 最小路径覆盖分为最小不相交路径覆盖和最小可相交路径覆盖. 最小不相交路径覆盖:每一条路径经过的顶点各不相同.如 ...
- HDU 3861 The King’s Problem 最小路径覆盖(强连通分量缩点+二分图最大匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 最小路径覆盖的一篇博客:https://blog.csdn.net/qq_39627843/ar ...
- POJ 2594 (传递闭包 + 最小路径覆盖)
题目链接: POJ 2594 题目大意:给你 1~N 个点, M 条有向边.问你最少需要多少个机器人,让它们走完所有节点,不同的机器人可以走过同样的一条路,图保证为 DAG. 很明显是 最小可相交路径 ...
- Air Raid POJ - 1422 【有向无环图(DAG)的最小路径覆盖【最小不相交路径覆盖】 模板题】
Consider a town where all the streets are one-way and each street leads from one intersection to ano ...
随机推荐
- openfoam耦合liggghts安装
本次安装基于新安装的ubuntu18.04LTS桌面版系统,用户名为ubuntu,此前未安装其他软件(进行了系统提醒的更新),安装时间为2019年9月. 安装前需确认需要安装的OpenFOAM版本,C ...
- 【机器学习】attention机制
参考: 1.https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html
- velocity 自定义工具类接入
网上的教程几乎都是同一篇: velocity 自定义工具类 - eggtk - CSDN 博客 但是教程有不完善的地方,我就补充一下. 补充: 引入的jar包和版本要一致.我们项目中因为没有定义确切版 ...
- 使用video.js 7在html中播放rtmp视频流
1.背景 最近要做摄像头视频的展示,不想使用硬件方的专用插件,所以计划视频推送到SRS服务器,浏览器再通过rtmp协议显示,类似于直播. 经查询,了解到可以用ckplayer(有许可条款)和video ...
- java学习笔记(6)-多线程(1)
标签(空格分隔): 笔记 一.基本概念 1.1 程序.进程.线程 程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process):是程 ...
- 转:路由 router-view
原文链接: 路由 router-view 路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容.H ...
- Word 文档内超级链接跳转到书签
1. 前言 在Word文档内如何实现一些跳转的超链接呢?Word中,一些外部链接,我们通常叫作超链接,内部链接我们可以叫书签.如何在文档中如何使用书签,跳转到指定位置? 这里我在网上随便找了一份模拟试 ...
- Linux大道——博客目录
Linux基础 第一章 计算机基础 计算机基础 网络基础 第二章 Linux基础
- Pythn基础课程笔记day03_学习内容概要及作业讲解
第三天_学习内容概要 今日内容概要 1.整形 2.布尔类型 3.字符串 内容回顾和补充 内容回顾 利用思维导图,罗列复习自己学习的内容,巩固知识点. xmind 软件 processon 网站 补充 ...
- WUSTOJ 1339: 土豪fcbruce(Java)
题目链接:1339: 土豪fcbruce Description 10年后,就职于Google的fcbruce赞助了武汉科技大学好多钱,学校因此决定扩建.第一步是新建宿舍楼,为了整洁美观,fcbruc ...