题意:

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

题解:

先跑一遍迪杰斯特拉,求出所有点的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. Table边框合并

    <style> table, table tr th, table tr td { border: 1px solid #0094ff; } table { width: 200px; m ...

  2. webapp兼容问题解决

    1. IOS移动端click事件300ms的延迟响应 移动设备上的web网页是有300ms延迟的,玩玩会造成按钮点击延迟甚至是点击失效.这是由于区分单击事件和双击屏幕缩放的历史原因造成的, 2007年 ...

  3. 【架构】spring framework核心框架体系结构

    Spring官方文档,用的版本为4.3.11版本. 一.引用官方文档 2.2.1核心集装箱 所述核心容器由以下部分组成spring-core, spring-beans,spring-context, ...

  4. 【hihocoder 1554】最短的 Nore0061

    [链接]http://hihocoder.com/problemset/problem/1554 [题意] 中文题 [题解] DP; 设f[i][j][k]表示前i个字符,第一个串已经得到了前j个字符 ...

  5. CSS中各种百分比(%)

    1.固定定位  position:absolute;width:100%;height:100%: 中%相对的   都是浏览器的可视窗口宽高. 2.标准文档流中,标签的 % 单位除了height以外, ...

  6. VS2010 下C++使用UTF8编码

    http://www.nubaria.com/en/blog/?p=289 #pragma execution_character_set("utf-8")

  7. 20140814 explicit

    1.explicit explicit   只对构造函数起作用,用来抑制隐式转换. 如:     class   A   {        A(int   a);   };  int   Functi ...

  8. 33-Ubuntu-用户权限-04-修改目录权限

    修改目录权限 例:test 1.可执行权限---x 减少目录x权限,无法切换到该目录 chmod -x test 2.读权限 ---r 减少目录r权限,无法读取(ls)目录信息 chmod -r te ...

  9. js进阶之路,关于UI资源的优化(转载)

    以下场景往往由于事件频繁被触发,因而频繁执行DOM操作.资源加载等重行为,导致UI停顿甚至浏览器崩溃. 1. window对象的resize.scroll事件 2. 拖拽时的mousemove事件 3 ...

  10. 内网渗透_win_socks代理_reGeorg+proxifier

    遇到内网windows机器,如果想远程登陆,通常得通过代理,常用的nc.lcx 工具可满足要求. 如 lcx 示例: 两台机器上均上传lcx.exe 在 xp机器(公网)上执行 lcx.exe -li ...