hdu多校第一场1005(hdu6582)Path 最短路/网络流
题意:
在无向图上删边,让此图上从起点到终点的最短路长度变大,删边的代价是边长,求最小代价。
题解:
先跑一遍迪杰斯特拉,求出所有点的d[]值,然后在原图上保留所有的边(i,j)仅当i,j满足d[j]-d[i]=l(i,j),在这个图上跑最小割。
时间复杂度O((E)logV+V^2*E)
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long LL;
#define ls (rt<<1)
#define rs (rt<<1|1)
const int M = 1e5 + ;
const LL mod = 1e9 + ;
const double eps = 1e-;
const double pi = acos(-);
const int INF = 0x3f3f3f3f;
const LL lINF = 0x3f3f3f3f3f3f3f3f;
const int maxn = 2e5 + ;
const int N = ;
int level[M];//顶点到源点的距离标号
int iter[M];//当前弧
int t;
int n, m;
struct edge {
int to;
LL cap, rev;
edge(int t, LL c, LL r) :to(t), cap(c), rev(r) {}
};
struct Edge {
int v;
LL w;
Edge() {}
Edge(int a, LL b) { v = a; w = b; }
};
vector<Edge> edge1[M];
vector<edge> g[M];
void init(int n)
{
for (int i = ; i <= n; i++)
{
g[i].clear();
edge1[i].clear();
}
memset(level, -, sizeof(level));
memset(iter, , sizeof(iter));
}
void addedge(int from, int to, LL cap)
{
g[from].push_back(edge(to, cap, g[to].size()));
g[to].push_back(edge(from, , g[from].size() - ));
}
void bfs(int s)
{
memset(level, -, sizeof(level));
queue<int>que;
level[s] = ;
que.push(s);
while (!que.empty())
{
int v = que.front();
que.pop();
for (int i = ; i < g[v].size(); i++)
{
edge &e = g[v][i];
if (e.cap > && level[e.to] < )
{
level[e.to] = level[v] + ;
que.push(e.to);
}
}
}
}
LL dfs(int v, int t, LL f)
{
if (v == t)
return f;
for (int &i = iter[v]; i < g[v].size(); i++)
{
edge &e = g[v][i];
if (e.cap > && level[v] < level[e.to])
{
LL d = dfs(e.to, t, min(f, e.cap));
if (d > )
{
e.cap -= d;
g[e.to][e.rev].cap += d;
return d;
}
}
}
return ;
}
LL maxflow(int s, int t)
{
LL flow = ;
while ()
{
bfs(s);
if (level[t] < )
return flow;
memset(iter, , sizeof(iter));
LL f;
while ((f = dfs(s, t, INF)) > )
{
flow += f;
}
}
}
int isv[M];
LL d[M];
int tot;
struct node {
int u;
LL dis;
node() {}
node(int a, LL b) { u = a; dis = b; }
bool operator <(const node & a)const
{
if (dis == a.dis)
return u < a.u;
else
return dis > a.dis;
}
}; struct edge2 {
int u, v;
LL cost;
}ed2[M*];
void dikjstra(int s)
{
for (int i = ; i <= n; i++)
{
d[i] = lINF;
isv[i] = ;
}
d[s] = ;
priority_queue<node>que;
que.push(node(s, d[s]));
while (!que.empty())
{
node nw = que.top();
que.pop();
int u = nw.u;
isv[u] = ;
for (int i = ; i < edge1[u].size(); i++)
{
int v = edge1[u][i].v;
LL w = edge1[u][i].w;
if (isv[v])
continue;
if (d[v] > d[u] + w)
{
d[v] = d[u] + w;
que.push(node(v, d[v]));
}
}
} }
void addedge1(int a, int b, LL c)
{
edge1[a].push_back(Edge(b, c));
}
void addedge2(int u, int v, LL cost)
{
ed2[tot].u = u;
ed2[tot].v = v;
ed2[tot++].cost = cost;
}
int main()
{
ios::sync_with_stdio(false);
cin >> t;
while (t--)
{
cin >> n >> m;
init(n);
tot = ;
for (int i = ; i < m; i++)
{
int u, v;
LL cost;
cin >> u >> v >> cost;
addedge1(u, v, cost);
addedge2(u, v, cost);
}
if (n == )
{
cout << << endl;
continue;
}
dikjstra();
for (int i = ; i < m; i++)
{
if (d[ed2[i].u] + ed2[i].cost == d[ed2[i].v])
{
addedge(ed2[i].u, ed2[i].v, ed2[i].cost);
}
}
cout << maxflow(, n) << endl;
}
}
hdu多校第一场1005(hdu6582)Path 最短路/网络流的更多相关文章
- hdu 多校第一场
1001 思路:打表可以发现只有3|n 和 4|n 的情况有解,判一下就好啦. #include<bits/stdc++.h> #define LL long long #define f ...
- hdu多校第一场 1006 (hdu6583)Typewriter dp/后缀自动机
题意: 有个打字机,在当前字符串后新加一个字花费p,把当前字符串的一个连续子串拷贝到当前字符串的末尾花费q,给定一个字符串,求用打字机打出这个字符串的最小花费. 题解: 容易想到用dp 记dp[i]为 ...
- hdu多校第二场 1005 (hdu6595) Everything Is Generated In Equal Probability
题意: 给定一个N,随机从[1,N]里产生一个n,然后随机产生一个n个数的全排列,求出n的逆序数对的数量,加到cnt里,然后随机地取出这个全排列中的一个非连续子序列(注意这个子序列可以是原序列),再求 ...
- hdu多校第一场1003 (hdu6580)Milk 背包
题意: 有一个n*m的矩阵,左右可以随便走,但只能在每一行的中点往下走,每走一格花费时间1. 现在这个矩阵里放了k瓶牛奶,第i个牛奶喝下去需要ti时间 起点是(1,1) 对于每个i∈[1,k],问喝掉 ...
- hdu多校第九场 1005 (hdu6684) Rikka with Game 博弈
题意: 给一个小写字母组成的字符串,每回合轮到某人时,此人可以选择让某位+1(如果是z则变回a),或者直接结束游戏. 先手希望游戏结束时字符串字典序尽量小,后手希望游戏结束时字符串字典序尽量大,求游戏 ...
- hdu多校第一场1004(hdu6581)Vacation 签到
题意:有n+1辆车,每辆车都有一定的长度,速度和距离终点的距离,第1-n辆车在前面依次排列,第0辆车在最后面.不允许超车,一旦后车追上前车,后车就减速,求第0辆车最快什么时候能到达终点? 思路:对于每 ...
- hdu多校第一场 1013(hdu6590)Code 凸包交
题意: 给定一组(x1,x2,y),其中y为1或0,问是否有一组(w1,w2,b),使得上述的每一个(x1,x2,y)都满足x1*w1+x2*w2+b在y=1时大于0,在y=-1时小于0. 题解: 赛 ...
- HDU6581 Vacation (HDU2019多校第一场1004)
HDU6581 Vacation (HDU2019多校第一场1004) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6581 题意: 给你n+1辆汽车, ...
- 2019牛客多校第一场 I Points Division(动态规划+线段树)
2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...
随机推荐
- 【Nacos】本地集群部署
关于Nacos已经展开了四篇入门文章: 初探Nacos(一)-- 单机模式启动 初探Nacos(二)-- SpringCloud使用Nacos的服务注册与发现 初探Nacos(三)-- SpringB ...
- 4-基于DoG的特征检测子(SIFT:稳定性好,实时性差)
opencv实现 详细原理:https://blog.csdn.net/u010440456/article/details/81483145
- targetSdkVersion和与target属性的区别
参考:http://blog.csdn.net/dai_zhenliang/article/details/8175781 AndroidMenifest.xml中targetSdkVersion和p ...
- jmter 二次开发 IDEA 项目5.1
jmter 二次开发 IDEA 项目5.1 IDEA 编译 Jmeter 5.0(二次开发) 1. Java环境配置 1.1 步骤1 1.2 步骤2 1.3 步骤3 1.4 ...
- PHP-FPM 远程代码执行漏洞(CVE-2019-11043)复现-含EXP
搭建容器 安装golang 利用程序 https://github.com/neex/phuip-fpizdam 安装git Cobra包安装 go get -v github.com/spf13/c ...
- Ubuntu12.04下Encountered a section with no Package: header错误解决方案
刚刚想在Ubuntu12.04下安装几个软件,sudo apt-get install libsqlite3-dev automake scratchbox2,没成想出现下面的错误: ...
- 【二】Jmeter接口自动化测试系列之函数使用及扩展
上一篇文章我们了解了Jmeter的参数化的集中方法,虽然方法不是很多,但已经足够使用! 本篇文章,介绍一下Jmeter自带函数的使用和 函数扩展,来满足测试工作中的各种需求! Jmeter自带函数 点 ...
- hdu6321 /// 状压DP
题目大意: 将一个 顶点不重复的边 的边集称为图中的matching 在一个n个点的零图中进行m次操作 + u v为在u v之间加一条边 存在重边 - u v为去掉u v之间的一条边 每次操作后 输出 ...
- python接口自动化(delete请求)
python接口自动化(delete请求) 一.delete请求的目的:删除资源 二.应用 导包:import requests 调用delete方法:requests.delete(url) 获取响 ...
- css 给图片添加滤镜效果,透明层毛玻璃效果
我们用的第一个滤镜是sepia(),他会给图片增加一整降饱和度的橙色染色效果 原图 添加sepia滤镜的效果 img{ width:100%; transition: .5s filter; filt ...