题意:

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

题解:

先跑一遍迪杰斯特拉,求出所有点的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. SQL SELECT DISTINCT

    SQL SELECT DISTINCT(选择不同) 语法 SELECT DISTINCT语法用于仅返回不同的(different)值. 在一张表内,一列通常包含许多重复的值; 有时你只想列出不同的(d ...

  2. 【Codeforces Round #429 (Div. 2) C】Leha and Function

    [Link]:http://codeforces.com/contest/841/problem/C [Description] [Solution] 看到最大的和最小的对应,第二大的和第二小的对应. ...

  3. RzGroupBar

    何分多层 procedure TForm1.FormCreate(Sender: TObject); begin RzGroup1.Items.Clear; RzGroup1.Items.Add.Ca ...

  4. unittest框架学习笔记一之testcase

    # coding=utf-8案例一: 2 ''' 3 Created on 2017-7-22 4 @author: Jennifer 5 Project:登录百度测试用例 6 ''' 7 from ...

  5. 在Windows的控制台和Linux的终端中显示加载进度

    Windows中 #include <stdio.h> #include <windows.h> int main() { ;//任务完成总量 int i; ; i < ...

  6. Linux上VNC 启动和关闭

    查询vnc的线程: [admin@cn2-uat-esb-01-0001 ~]$ ps -ef|grep vncadmin 19080 21305 0 10:04 pts/2 00:00:00 gre ...

  7. jenkins在pipline中运行后台命令

    需求 在jenkin中启动java程序或者python程序的时候,希望程序在后台执行,并在jenkins构建完成之后继续执行.在工作中有两个地方我碰到了这种需求 在shell script输入框中pi ...

  8. hexo next博客之无敌之舒服之美妙之轻松之发布博客(mweb,github自主开发插件)

    文章目录 **前言:** 具体用法 **mweb for mac** 注意 **github插件下载** 个人博客:https://mmmmmm.me 源码:https://github.com/da ...

  9. 9. Python函数

    函数 函数能提高应用的模块性,和代码的重复利用率.定义一个函数比较简单,但是需要遵循以下几点规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 任何传入参数和自变量必须放在圆 ...

  10. 机器学习技法笔记:Homework #8 kNN&RBF&k-Means相关习题

    原文地址:https://www.jianshu.com/p/1db700f866ee 问题描述 程序实现 # kNN_RBFN.py # coding:utf-8 import numpy as n ...