因为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】游行 最小可相交路径覆盖转化的更多相关文章

  1. POJ 2594 Treasure Exploration 最小可相交路径覆盖

    最小路径覆盖 DAG的最小可相交路径覆盖: 算法:先用floyd求出原图的传递闭包,即如果a到b有路径,那么就加边a->b.然后就转化成了最小不相交路径覆盖问题. 这里解释一下floyd的作用如 ...

  2. POJ2594 Treasure Exploration[DAG的最小可相交路径覆盖]

    Treasure Exploration Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 8301   Accepted: 3 ...

  3. POJ 2594 Treasure Exploration(最小可相交路径覆盖)题解

    题意:有n个点,m条单向边,每个机器人能沿着单向边走,能重复经过一个点,问最少几个机器人走遍n个点 思路:原来以前学的都是不能相交的算法....可相交的做法是跑Floyd把能到达的都加上边,然后跑最小 ...

  4. FJUT3591 侦测到在途的聚变打击(最小不可相交路径覆盖)题解

    题意:给你n个点,点间m条路,给出在每条路要走的时间.现在有q个任务,要摧毁q个点,每次提供ci和ti表示在时间ti摧毁点ci(必须正好在时间ti才能摧毁),每个点可能需要多次摧毁(同一时间能在同一个 ...

  5. 有向无环图(DAG)的最小路径覆盖(转)

    DAG的最小路径覆盖 定义:在一个有向图中,找出最少的路径,使得这些路径经过了所有的点. 最小路径覆盖分为最小不相交路径覆盖和最小可相交路径覆盖. 最小不相交路径覆盖:每一条路径经过的顶点各不相同.如 ...

  6. 有向无环图(DAG)的最小路径覆盖

    DAG的最小路径覆盖 定义:在一个有向图中,找出最少的路径,使得这些路径经过了所有的点. 最小路径覆盖分为最小不相交路径覆盖和最小可相交路径覆盖. 最小不相交路径覆盖:每一条路径经过的顶点各不相同.如 ...

  7. HDU 3861 The King’s Problem 最小路径覆盖(强连通分量缩点+二分图最大匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 最小路径覆盖的一篇博客:https://blog.csdn.net/qq_39627843/ar ...

  8. POJ 2594 (传递闭包 + 最小路径覆盖)

    题目链接: POJ 2594 题目大意:给你 1~N 个点, M 条有向边.问你最少需要多少个机器人,让它们走完所有节点,不同的机器人可以走过同样的一条路,图保证为 DAG. 很明显是 最小可相交路径 ...

  9. Air Raid POJ - 1422 【有向无环图(DAG)的最小路径覆盖【最小不相交路径覆盖】 模板题】

    Consider a town where all the streets are one-way and each street leads from one intersection to ano ...

随机推荐

  1. 基于TreeSoft实现异构数据同步

    一.为了解决数据同步汇聚,数据分发,数据转换,数据维护等需求,TreeSoft将复杂的网状的同步链路变成了星型数据链路.     TreeSoft作为中间传输载体负责连接各种数据源,为各种异构数据库之 ...

  2. springboot 通过docker 打包编译镜像

    添加plugin <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...

  3. idea删除工作记录

    或者

  4. [转载]SQL Server提权系列

    本文原文地址:https://www.cnblogs.com/wintrysec/p/10875232.html 一.利用xp_cmdshell提权 xp_cmdshell默认是关闭的,可以通过下面的 ...

  5. 将自己的项目作为jar包发布到maven中央仓库

    maven版本是3.5.0,jdk是1.8(注意,不是说项目是1.8就行,必须是环境变量里的也是,不能超过1.8,否则一大堆问题,执行mvn前用javac -version看下版本) 一:先在sona ...

  6. python开发【学习目录】:目录

    python开发[学习目录]:目录 Python开发:环境搭建(python3.PyCharm) Python开发[第一篇]:初识Python Python开发[第二篇]:Python基础知识 Pyt ...

  7. gensim中word2vec

    from gensim.models import Word2Vec Word2Vec(self, sentences=None, size=100, alpha=0.025, window=5, m ...

  8. 使用RestTemplate进行服务调用的几种方式

    首先我们在名为MSG的服务中定义一个简单的方法 @RestController public class ServerController { @GetMapping("/msg" ...

  9. 使用Lombok总结

    Lombok学习总结 Project Lombok is a java library that automatically plugs into your editor and build tool ...

  10. go语言实现链式栈

    haa哈哈== import "errors" var ( // ErrEmpty 栈为空 ErrEmpty = errors.New("stack is empty&q ...