hdu3416+hdu6582(最短路+最大流)
题意
hdu3416:
给一个图,边不能重复选,问有多少个最短路
hdu6582:
给一个图,问最少删除边权多少的边后,最短路长度增加
分析
边不能重复选这个条件可以想到边权为1,跑最大流,所以我们可以先跑出最短路,再把最短路中的边作为网络流中的边跑一遍最大流即可。
最短路长度增加即最短路这个子图不再联通,要使一个图不再联通的最小代价显然就是最小割,也等于最大流。
找出最短路中的边的方法是从s正着跑一遍最短路,再从t逆着跑一遍最短路,如果\(low[u]+rev[v]+w==low[t]\),则\((u,v)\)为最短路中的边。
代码(hdu6582)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e4+50;
const ll INF=1e18;
int T,n,m;
int uu[N],vv[N];
ll ww[N];
vector<pair<int,int> > g[N];
ll low[N],rev[N];
bool vis[N];
struct node{
int v;
ll c;
bool operator<(const node &rhs)const{
return c>rhs.c;
}
};
void dijkstra(int s,ll low[]){
for(int i=1;i<=n;i++){
low[i]=INF;
vis[i]=false;
}
low[s]=0;
priority_queue<node> pq;
pq.push(node{s,low[s]});
while(!pq.empty()){
node tmp=pq.top();
pq.pop();
int u=tmp.v;
if(vis[u]){
continue;
}
vis[u]=true;
int siz=g[u].size();
for(int i=0;i<siz;i++){
int v=g[u][i].first;
ll w=g[u][i].second;
if(!vis[v] && low[v]>low[u]+w){
low[v]=low[u]+w;
pq.push(node{v,low[v]});
}
}
}
}
struct Edge{
int v,w,next;
}edge[N*2];
int cnt,head[N];
void init(){
cnt=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v,int w){
edge[cnt]=Edge{v,w,head[u]};
head[u]=cnt++;
edge[cnt]=Edge{u,0,head[v]};
head[v]=cnt++;
}
int dep[N];
bool bfs(){
memset(dep,0,sizeof(dep));
dep[1]=1;
queue<int> q;
q.push(1);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].v;
ll w=edge[i].w;
if(w>0 && dep[v]==0){
dep[v]=dep[u]+1;
q.push(v);
}
}
}
return dep[n]!=0;
}
int cur[N];
ll dfs(int u,ll flow){
if(u==n){
return flow;
}
for(int &i=cur[u];i!=-1;i=edge[i].next){
int v=edge[i].v;
ll w=edge[i].w;
if(dep[v]==dep[u]+1 && w>0){
int dis=dfs(v,min(w,flow));
if(dis>0){
edge[i].w-=dis;
edge[i^1].w+=dis;
return dis;
}
}
}
return 0;
}
ll dinic(){
ll ans=0;
while(bfs()){
for(int i=1;i<=n;i++){
cur[i]=head[i];
}
while(ll d=dfs(1,INF)){
ans+=d;
}
}
return ans;
}
int main(void){
// freopen("in.txt","r",stdin);
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
g[i].clear();
}
for(int i=0;i<m;i++){
scanf("%d%d%lld",&uu[i],&vv[i],&ww[i]);
g[uu[i]].push_back({vv[i],ww[i]});
}
dijkstra(1,low);
for(int i=1;i<=n;i++){
g[i].clear();
}
for(int i=0;i<m;i++){
g[vv[i]].push_back({uu[i],ww[i]});
}
dijkstra(n,rev);
init();
for(int i=0;i<m;i++){
if(uu[i]!=vv[i] && low[uu[i]]+rev[vv[i]]+ww[i]==low[n]){
add(uu[i],vv[i],ww[i]);
}
}
ll ans=dinic();
printf("%lld\n",ans);
}
return 0;
}
hdu3416+hdu6582(最短路+最大流)的更多相关文章
- hdu5294||2015多校联合第一场1007 最短路+最大流
http://acm.hdu.edu.cn/showproblem.php? pid=5294 Problem Description Innocent Wu follows Dumb Zhang i ...
- BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )
最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...
- 【最短路+最大流】上学路线@安徽OI2006
目录 [最短路+最大流]上学路线@安徽OI2006 PROBLEM SOLUTION CODE [最短路+最大流]上学路线@安徽OI2006 PROBLEM 洛谷P4300 SOLUTION 先在原图 ...
- P3376 【模板】网络最大流——————Q - Marriage Match IV(最短路&最大流)
第一道题是模板题,下面主要是两种模板,但都用的是Dinic算法(第二个题也是) 第一题: 题意就不需要讲了,直接上代码: vector代码: 1 //invalid types 'int[int]' ...
- HDU-3416 Marriage Match IV 最短路+最大流 找各最短路的所有边
题目链接:https://cn.vjudge.net/problem/HDU-3416 题意 给一个图,求AB间最短路的条数(每一条最短路没有重边.可有重复节点) 思路 首先把全部最短路的边找出来,再 ...
- hdu3416 最短路+最大流
题意:有 n 点 m 边,有出发点 A 到达点 B ,只允许走原图中的最短路,但每条边只允许被走一次,问最多能找出多少条边不重复的最短路 一开始做到的时候瞎做了一发最短路,WA了之后也知道显然不对,就 ...
- hdu3416 Marriage Match IV【最短路+最大流】
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4297581.html ---by 墨染之樱花 题目链接:http://acm.hdu.ed ...
- hdu3416 Marriage Match IV 最短路+ 最大流
此题的大意:给定一幅有向图,求起点到终点(都是固定的)的不同的最短路有多少条.不同的最短路是说不能有相同的边,顶点可以重复.并且图含有平行边. 看了题以后,就想到暴力,但是暴力往往是不可取的.(暴力的 ...
- hdu3416 判断最短路是否唯一(每条边只能走一次)
Marriage Match IV Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- mac下 编译php的 openssl
编译openssl.so tar zxvf php-7.2.8.tar.gz# 进入PHP的openssl扩展模块目录cd php-7.2.8/ext/openssl/brew install ope ...
- Spark之权威指南经典案例
hadoop权威指南上有一个求历史最高温度的经典案例,源数据如下: -- sample.txt0067011990999991950051507004+68750+023550FM-12+038299 ...
- Nio编程模型总结
终于,这两天的考试熬过去了, 兴致冲冲的来整理笔记来, 这篇博客是我近几天的NIO印象笔记汇总,记录了对Selector及Selector的重要参数的理解,对Channel的理解,常见的Channel ...
- 10-pymysql的应用
import pymysql # user = input('请输入用户名:') # pwd = input('请输入密码:') # 1.创建连接 conn = pymysql.connect(hos ...
- 机器学习经典算法之KNN
一.前言 KNN 的英文叫 K-Nearest Neighbor,应该算是数据挖掘算法中最简单的一种. 先用一个例子体会下. /*请尊重作者劳动成果,转载请标明原文链接:*/ /* https://w ...
- [Abp vNext 源码分析] - 4. 工作单元
一.简要说明 统一工作单元是一个比较重要的基础设施组件,它负责管理整个业务流程当中涉及到的数据库事务,一旦某个环节出现异常自动进行回滚处理. 在 ABP vNext 框架当中,工作单元被独立出来作为一 ...
- Zookeeper_ACL
getAcl path 查看某个node的权限 设置权限1 world方式 setAcl <path> world:anyone:<acl>例如 setAcl /node1 w ...
- header 无法实现跳转
错误:Warning: Cannot modify header information - headers already sent by (output started at 方法:“php.in ...
- 从0x00到0xFF的含义
对于二进制来说,8位二进制我们称之为一个字节,二进制的表达范围值是从0b00000000-0b11111111,而我们程序中用十六进制表示的时候就是从0x00到0xFF,这里教大家一个二进制转换十进制 ...
- python的输入和输出
基本输出 python中的输出使用关键字--print,与python2不同的是,python3的输出后面必须要加括号,示例如下: python3.0以上输出: python2.0以上的输出: 格式化 ...