题意:

在无向图上删边,让此图上从起点到终点的最短路长度变大,删边的代价是边长,求最小代价。

题解:

先跑一遍迪杰斯特拉,求出所有点的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 最短路/网络流的更多相关文章

  1. hdu 多校第一场

    1001 思路:打表可以发现只有3|n 和 4|n 的情况有解,判一下就好啦. #include<bits/stdc++.h> #define LL long long #define f ...

  2. hdu多校第一场 1006 (hdu6583)Typewriter dp/后缀自动机

    题意: 有个打字机,在当前字符串后新加一个字花费p,把当前字符串的一个连续子串拷贝到当前字符串的末尾花费q,给定一个字符串,求用打字机打出这个字符串的最小花费. 题解: 容易想到用dp 记dp[i]为 ...

  3. hdu多校第二场 1005 (hdu6595) Everything Is Generated In Equal Probability

    题意: 给定一个N,随机从[1,N]里产生一个n,然后随机产生一个n个数的全排列,求出n的逆序数对的数量,加到cnt里,然后随机地取出这个全排列中的一个非连续子序列(注意这个子序列可以是原序列),再求 ...

  4. hdu多校第一场1003 (hdu6580)Milk 背包

    题意: 有一个n*m的矩阵,左右可以随便走,但只能在每一行的中点往下走,每走一格花费时间1. 现在这个矩阵里放了k瓶牛奶,第i个牛奶喝下去需要ti时间 起点是(1,1) 对于每个i∈[1,k],问喝掉 ...

  5. hdu多校第九场 1005 (hdu6684) Rikka with Game 博弈

    题意: 给一个小写字母组成的字符串,每回合轮到某人时,此人可以选择让某位+1(如果是z则变回a),或者直接结束游戏. 先手希望游戏结束时字符串字典序尽量小,后手希望游戏结束时字符串字典序尽量大,求游戏 ...

  6. hdu多校第一场1004(hdu6581)Vacation 签到

    题意:有n+1辆车,每辆车都有一定的长度,速度和距离终点的距离,第1-n辆车在前面依次排列,第0辆车在最后面.不允许超车,一旦后车追上前车,后车就减速,求第0辆车最快什么时候能到达终点? 思路:对于每 ...

  7. 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. 题解: 赛 ...

  8. HDU6581 Vacation (HDU2019多校第一场1004)

    HDU6581 Vacation (HDU2019多校第一场1004) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6581 题意: 给你n+1辆汽车, ...

  9. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

随机推荐

  1. leetcode-164周赛-1267-统计参与通信的服务器

    题目描述: 自己的提交: class Solution: def countServers(self, grid: List[List[int]]) -> int: from collectio ...

  2. Frost & Sullivan权威报告:阿里云再次领跑云WAF大中华区市场

    近日,国际权威分析机构Frost & Sullivan 针对Web应用防火墙(简称“WAF”)领域发布了<2017年亚太区Web应用防火墙市场报告>,阿里云以市场占有率45.8%的 ...

  3. CSS Id 和 Class

    id 和 class 选择器 如果你要在HTML元素中设置CSS样式,你需要在元素中设置"id" 和 "class"选择器.直线电机哪家好 id 选择器 id ...

  4. 使用Nodejs 的http-proxy 模块做代理服务器的尝试

    参考 : https://blog.csdn.net/zhihuoqian9683/article/details/78944482  (亲测可行) http://www.mizuiren.com/4 ...

  5. centos7下命令行配置nginx

    本教程中的步骤要求用户拥有root权限 第一步 - 添加Nginx存储库要添加CentOS 7 EPEL仓库,请打开终端并使用以下命令: sudo yum install epel-release第二 ...

  6. (转)XMPP协议原理

    本文介绍XMPP协议原理及相关信息. XMPP协议简介   XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM ...

  7. Linux shell模拟多线程拷贝

    #!/bin/sh #日志文件 log_file=/data/threadcp.log a=$(date +%H%M%S) echo -e "startTime:\t$a" #最大 ...

  8. Linux初始化的汇编代码

    1. 内核文件布局 首先看一下arch/x86/boot/Setup.ld文件,它定义了链接后的内核文件布局. 1: /* 2: * setup.ld 3: * 4: * Linker script ...

  9. 2019杭电多校第三场hdu6609 Find the answer(线段树)

    Find the answer 题目传送门 解题思路 要想变0的个数最少,显然是优先把大的变成0.所以离散化,建立一颗权值线段树,维护区间和与区间元素数量,假设至少减去k才能满足条件,查询大于等于k的 ...

  10. 2019ICPC南京网络赛B super_log

    题意:求a的a的a次方..一直求b次,也就是在纸上写个a,然后一直a次方a次方,对m取模,记为F(a,b,m)=pow(a,F(a,b-1,phi(m)) 解题思路:联系欧拉降幂,这个迭代的过程,我们 ...