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个点,每个点有 ...
随机推荐
- leetcode-164周赛-1266-访问所有点的最小时间
题目描述: 自己的解: class Solution: def minTimeToVisitAllPoints(self, points: List[List[int]]) -> int: re ...
- 线段树求后继+环——cf1237D
/* 首先开三倍消环(两倍是不够的),倒序求值,线段树找一下后继即可 */ #include<bits/stdc++.h> using namespace std; #define N 3 ...
- php 如何实现 数据库 连接池
php 如何实现 数据库 连接池 一.总结 一句话总结: php+sqlrelay+mysql实现连接池及读写负载均衡 master-slave模式增加并发. sqlrelay 解决连接池问题以及实现 ...
- linux进阶之路(三):vi/vim编辑器
所有Linux都会内置vi,vim是vi的增强版本,被誉为"编辑之神",玩转vim可以让你完全脱离鼠标. vim可以分为两种模式: 普通模式:使用vim 文件名,进入普通模式.普通 ...
- asp.net core网关Ocelot的简单介绍& Ocelot集成Identity认证
文章简介 Ocelot网关简介 Ocelot集成Idnetity认证处理 Ocelot网关简介 Ocelot是一个基于netcore实现的API网关,本质是一组按特定顺序排列的中间件.Ocelot内 ...
- svn 类似.gitignore功能实现
svn propset -R svn:ignore -F .cvsignore .
- Dubbo面试20问!这些题你都遇到过吗?
作者:Dean Wang https://deanwang1943.github.io/bugs/2018/10/05/面试/饿了么/dubbo 面试题/ 1.dubbo是什么 dubbo是一个分布式 ...
- <Git>git学习
1.安装 分布式版本控制:工作电脑保存完整的代码,中央服务器挂了也可以使用 集中式版本控制:中央服务器挂了就凉凉 sudo apt-get install git git安装 检测安装成功 git 2 ...
- 5、如何快速找到多个字典中的公共键(key) 6 如何让字典保持有序 7 如何实现用户的历史记录功能(最多n条)
5.如何快速找到多个字典中的公共键(key) from random import randint,sample #随机取数 # a = sample("ABCDEF",randi ...
- struts2注解方式的验证
struts2的验证分为分编程式验证.声明式验证.注解式验证.因现在的人越来越懒,都追求零配置,所以本文介绍下注解式验证. 一.hello world 参考javaeye的这篇文章,按着做一次,起码有 ...