[2019杭电多校第一场][hdu6582]Path(最短路&&最小割)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582
题意:删掉边使得1到n的最短路改变,删掉边的代价为该边的边权。求最小代价。
比赛时一片浆糊,赛后听到dinic瞬间思维通透XD
大致做法就是先跑一遍最短路,然后再保留所有满足dis[i]+w==dis[j]的边,在这些边上跑最小割(dinic)。
代码写的异常丑陋,见谅QAQ
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
using namespace std;
typedef long long ll;
const ll maxn = 3e5 + ;
const ll inf = 1e18;
struct node {
ll s, e, next;
ll w;
}edge[maxn * ], edge2[maxn * ];
ll head[maxn], head2[maxn], len, len2;
void init() {
memset(head, -, sizeof(head));
memset(head2, -, sizeof(head2));
len = len2 = ;
}
void add(ll s, ll e, ll w) {
edge[len].s = s;
edge[len].e = e;
edge[len].w = w;
edge[len].next = head[s];
head[s] = len++;
}
void add2(ll s, ll e, ll w) {
edge2[len2].s = s;
edge2[len2].e = e;
edge2[len2].w = w;
edge2[len2].next = head2[s];
head2[s] = len2++;
}
struct p {
ll dis, num;
bool operator<(const p&a)const {
return a.dis < dis;
}
};
ll dis[maxn];
ll vis[maxn];
void dij(ll n) {
priority_queue<p>q;
for (ll i = ; i <= n; i++)
dis[i] = inf, vis[i] = ;
q.push({ 0ll,1ll });
dis[] = 0ll;
while (!q.empty()) {
ll x = q.top().num;
q.pop();
if (vis[x])
continue;
vis[x] = ;
for (ll i = head[x]; i != -; i = edge[i].next) {
ll y = edge[i].e;
if (dis[y] > dis[x] + edge[i].w) {
dis[y] = dis[x] + edge[i].w;
q.push({ dis[y],y });
}
}
}
}
ll d[maxn];
bool bfs(ll s, ll t) {
queue<ll>q;
memset(d, , sizeof(d));
d[s] = 1ll;
q.push(s);
while (!q.empty()) {
ll x = q.front(); q.pop();
for (ll i = head2[x]; i != -; i = edge2[i].next) {
ll y = edge2[i].e;
if (edge2[i].w && !d[y]) {
d[y] = d[x] + 1ll;
q.push(y);
}
}
}
return d[t];
}
ll dfs(ll x, ll t, ll limit) {
if (x == t)
return limit;
ll add, ans = ;
for (ll i = head2[x]; i != -; i = edge2[i].next) {
ll y = edge2[i].e;
if (d[y] == d[x] + && edge2[i].w) {
add = dfs(y, t, min(limit, edge2[i].w));
edge2[i].w -= add;
edge2[i ^ ].w += add;
ans += add;
limit -= add;
if (!limit)
break;
}
}
if (!ans)
d[x] = -;
return ans;
}
ll dinic(ll s, ll t) {
ll ans = ;
while (bfs(s, t))
ans += dfs(s, t, inf);
return ans;
}
int main() {
ll t;
scanf("%lld", &t);
while (t--) {
ll n, m;
init();
scanf("%lld%lld", &n, &m);
ll x, y, z;
for (ll i = ; i <= m; i++) {
scanf("%lld%lld%lld", &x, &y, &z);
add(x, y, z);
}
dij(n);
for (ll i = ; i <= n; i++)
for (ll j = head[i]; j != -; j = edge[j].next)
if (dis[edge[j].s] + edge[j].w == dis[edge[j].e])
add2(edge[j].s, edge[j].e, edge[j].w), add2(edge[j].e, edge[j].s, 0ll);
printf("%lld\n", dinic(, n));
}
return ;
}
[2019杭电多校第一场][hdu6582]Path(最短路&&最小割)的更多相关文章
- 2019杭电多校第一场hdu6581 Vacation
Vacation 题目传送门 update(O(n)) 看了那个O(n)的方法,感觉自己想的那个O(nlogn)的好傻,awsl. 0车最终通过停车线的时候,状态一定是某个车堵住后面的所有车(这个车也 ...
- [2019杭电多校第一场][hdu6583]Typewriter(后缀自动机&&dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6583 大致题意是说可以花费p在字符串后添加一个任意字符,或者花费q在字符串后添加一个当前字符串的子串. ...
- [2019杭电多校第一场][hdu6579]Operation(线性基)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6579 题目大意是两个操作,1个是求[l,r]区间子序列的最大异或和,另一个是在最后面添加一个数. 如果 ...
- [2019杭电多校第一场][hdu6578]Blank(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6578 计数问题想到dp不过分吧... dp[i][j][k][w]为第1-i位置中4个数最后一次出现的 ...
- 2019杭电多校第一场hdu6579 Operation(线性基)
Operation 题目传送门 解题思路 把右边的数尽量往高位放,构造线性基的时候同时记录其在原序列中的位置,在可以插入的时候如果那个位置上存在的数字的位置比新放入的要小,就把旧的往后挤.用这种发现构 ...
- 2018 Multi-University Training Contest 1 杭电多校第一场
抱着可能杭电的多校1比牛客的多校1更恐怖的想法 看到三道签到题 幸福的都快哭出来了好吗 1001 Maximum Multiple(hdoj 6298) 链接:http://acm.hdu.edu. ...
- 2019年杭电多校第一场 1009题String(HDU6586+模拟+单调栈)
题目链接 传送门 题意 给你一个字符串,要你构造一个长为\(k\)的子串使得每个字母出现的次数在\([L_i,R_i](0\leq i\leq26)\)间且字典序最小. 思路 做这种题目就是要保持思路 ...
- 2019年杭电多校第一场 1004题Vacation(HDU6581+数学)
题目链接 传送门 题意 有\(n+1\)辆车要过红绿灯,告诉你车的长度.与红绿灯的起点(题目假设红绿灯始终为绿).车的最大速度,问你第\(0\)辆车(距离最远)车头到达红绿灯起点的时间是多少(每辆车最 ...
- 2019年杭电多校第一场 1002题Operation(HDU6579+线性基)
题目链接 传送门 题意 初始时有\(n\)个数,现在有\(q\)次操作: 查询\([l,r]\)内选择一些数使得异或和最大: 在末尾加入一个数. 题目强制在线. 思路 对于\(i\)我们记录\([1, ...
随机推荐
- 摘抄大神对VUE 中slot-scope的深度理解
Vue的slot-scope的场景的个人理解 这篇文章不是单纯把文档的话和api拿来翻译和演示,而是谈谈我对于slot-scope的使用场景的个人理解,如果理解错误,欢迎讨论! Vue的插槽slot, ...
- CF39H 【Multiplication Table】
这题可以枚举出每个i,j 位置的数>需要用到进制转换 int zh(int x){ long long sum=0,i=0; while(x){ sum=sum+((x%n)*pow(10,i) ...
- 基础数据类型之集合和深浅copy,还有一些数据类型补充
集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...
- luogu P4437 [HNOI/AHOI2018]排列
luogu 问题本质是把\(a_i\)作为\(i\)的父亲,然后如果有环就不合法,否则每次要取数,要满足取之前他的父亲都被取过(父亲为0可以直接取),求最大价值 贪心想法显然是要把权值大的尽量放在后面 ...
- jquery ready load
jq 加载三种写法 $(document).ready(function() { // ...代码... }) //document ready 简写 $(function() { // ...代码. ...
- NTL 库函数
NTL是一个高性能,可移植的C ++库,为任意长度的整数提供数据结构和算法; 可用于整数和有限域上的向量,矩阵和多项式; 可用于任意精度浮点运算. NTL为以下方面提供高质量的最先进算法实现: 任意长 ...
- linux命令详解——yum
1.如果不知道确切名字可以:rpm -qa|grep pkgname 2.查看软件安装的文件:rpm -qpl pkgname 3.如果不知道提供某个软件的包是叫什么,可以使用类似下面的写法: yum ...
- deep_learning_Function_bath_normalization()
关于归一化的讲解的博客——[深度学习]Batch Normalization(批归一化) tensorflow实现代码在这个博客——[超分辨率]TensorFlow中批归一化的实现——tf.layer ...
- vs2017新建一个空项目
我们会发现VS2017的控制台程序创建之后会有一些头文件这和之前的VS的版本不一样之前的都可以选择空项目来避免,下面我们就来介绍方法: 首先我们不要创建新的控制台项目,而是创建桌面向导: 然后我们就可 ...
- 《Maven 实战》笔记之setting.xml介绍
maven是什么?有什么用? Maven是一个跨平台的项目管理工具,主要服务于Java平台的项目构建,依赖管理和项目信息管理.项目构建包括创建项目框架.清理.编译.测试.到生成报告,再到打包和部署,项 ...