MCMF最大流最小割(模板)Dijkstra负权优化
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#include <cstdio>//sprintf islower isupper
#include <cstdlib>//malloc exit strcat itoa system("cls")
#include <iostream>//pair
#include <fstream>//freopen("C:\\Users\\13606\\Desktop\\Input.txt","r",stdin);
#include <bitset>
//#include <map>
//#include<unordered_map>
#include <vector>
#include <stack>
#include <set>
#include <string.h>//strstr substr
#include <string>
#include <time.h>// srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9;
#include <cmath>
#include <deque>
#include <queue>//priority_queue<int, vector<int>, greater<int> > q;//less
#include <vector>//emplace_back
//#include <math.h>
#include <cassert>
//#include <windows.h>//reverse(a,a+len);// ~ ! ~ ! floor
#include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare)
using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation
//******************
int abss(int a);
int lowbit(int n);
int Del_bit_1(int n);
int maxx(int a,int b);
int minn(int a,int b);
double fabss(double a);
void swapp(int &a,int &b);
clock_t __STRAT,__END;
double __TOTALTIME;
void _MS(){__STRAT=clock();}
void _ME(){__END=clock();__TOTALTIME=(double)(__END-__STRAT)/CLOCKS_PER_SEC;cout<<"Time: "<<__TOTALTIME<<" s"<<endl;}
//***********************
#define rint register int
#define fo(a,b,c) for(rint a=b;a<=c;++a)
#define fr(a,b,c) for(rint a=b;a>=c;--a)
#define mem(a,b) memset(a,b,sizeof(a))
#define pr printf
#define sc scanf
#define ls rt<<1
#define rs rt<<1|1
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef long long ll;
const double E=2.718281828;
const double PI=acos(-1.0);
//const ll INF=(1LL<<60);
const int inf=(<<);
const double ESP=1e-;
const int mod=(int)1e9+;
const int N=(int)1e5+; int n,m,S,T;
class MCMF
{
public:
struct node
{
int u,v,f,w,nxt;
}edge[N];
int head[N],tot;
int h[N],dis[N],PrePoint[N],PreEdge[N];
void Init(int n)
{
tot=-;
for(int i=;i<=n;++i)
head[i]=-,h[i]=;
}
void add(int x,int y,int f,int w)
{
++tot;
edge[tot]={x,y,f,w,head[x]};
head[x]=tot;
}
void Add(int x,int y,int f,int w)
{
add(x,y,f,w);
add(y,x,,-w);
}
PII Dij()
{
int max_flow=,min_cost=;
while()
{
priority_queue<PII>q;
for(int i=;i<=n;++i)
dis[i]=inf;
dis[S]=;
q.push({,S});
while(!q.empty())
{
PII now=q.top();q.pop();
if(-now.first!=dis[now.second])continue;
if(now.second==T)break;
for(int i=head[now.second];i!=-;i=edge[i].nxt)
{
int nowcost=edge[i].w+h[now.second]-h[edge[i].v];
if(edge[i].f>&&dis[edge[i].v]>dis[now.second]+nowcost)
{
dis[edge[i].v]=dis[now.second]+nowcost;
q.push({-dis[edge[i].v],edge[i].v});
PrePoint[edge[i].v]=now.second;
PreEdge[edge[i].v]=i;
}
}
}
if(dis[T]==inf)break;
for(int i=;i<=n;++i)h[i]+=dis[i];
int nowflow=inf;
for(int i=T;i!=S;i=PrePoint[i])
nowflow=min(nowflow,edge[PreEdge[i]].f);
for(int i=T;i!=S;i=PrePoint[i])
{
edge[PreEdge[i]].f-=nowflow;
edge[PreEdge[i]^].f+=nowflow;
}
max_flow+=nowflow;
min_cost+=nowflow*h[T];
}
return {max_flow,min_cost};
}
}G; char mp[][];
int id[][]; int main()
{
int h,l;
while(sc("%d%d",&h,&l),h&&l)
{
S=h*l+,T=h*l+;
int cnt=;
fo(i,,h)
fo(j,,l)
sc("%1s",&mp[i][j]),id[i][j]=++cnt;
n=h*l+;
G.Init(n);
for(int i=;i<=h;++i)
{
for(int j=;j<=l;++j)
{
if(i>)G.Add(id[i][j],id[i-][j],inf,);
if(j>)G.Add(id[i][j],id[i][j-],inf,);
if(i<h)G.Add(id[i][j],id[i+][j],inf,);
if(j<l)G.Add(id[i][j],id[i][j+],inf,);
if(mp[i][j]=='m')G.Add(S,id[i][j],,);
if(mp[i][j]=='H')G.Add(id[i][j],T,,);
}
}
PII ans=G.Dij();
pr("%d\n",ans.second);
}
return ;
} /**************************************************************************************/ int maxx(int a,int b)
{
return a>b?a:b;
} void swapp(int &a,int &b)
{
a^=b^=a^=b;
} int lowbit(int n)
{
return n&(-n);
} int Del_bit_1(int n)
{
return n&(n-);
} int abss(int a)
{
return a>?a:-a;
} double fabss(double a)
{
return a>?a:-a;
} int minn(int a,int b)
{
return a<b?a:b;
}
MCMF最大流最小割(模板)Dijkstra负权优化的更多相关文章
- POJ 3680 Intervals(费用流+负权优化)
[题目链接] http://poj.org/problem?id=3680 [题目大意] 有N个带权重的区间,现在要从中选取一些区间, 要求任意点都不被超过K个区间所覆盖,请最大化总的区间权重. [题 ...
- poj 3469 最小割模板sap+gap+弧优化
/*以核心1为源点,以核心2为汇点建图,跑一遍最大流*/ #include<stdio.h> #include<string.h> #include<queue> ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- 【SPFA与Dijkstra的对比】CDOJ 1961 咸鱼睡觉觉【差分约束-负权最短路径SPFA】
差分约束系统,求最小值,跑最长路. 转自:https://www.cnblogs.com/ehanla/p/9134012.html 题解:设sum[x]为前x个咕咕中至少需要赶走的咕咕数,则sum[ ...
- 洛谷 P4779 【dijkstra】+(堆优化)+(链式前向星) (模板题)
<题目链接> 题目描述 给定一个 N 个点, M 条有向边的带非负权图,请你计算从 S 出发,到每个点的距离. 数据保证你能从 S 出发到任意点. 输入格式: 第一行为三个正整数 N,M, ...
- 单源最短路:Dijkstra算法 及 关于负权的讨论
描述: 对于图(有向无向都适用),求某一点到其他任一点的最短路径(不能有负权边). 操作: 1. 初始化: 一个节点大小的数组dist[n] 源点的距离初始化为0,与源点直接相连的初始化为其权重,其他 ...
- Bellman-Ford(可解决负权边)--时间复杂度优化
Bellman-Ford 可解决带有负权边的最短路问题 解决负权边和Dijkstra相比是一个优点,Bellman-Ford的核心代码只有4行:: u[],v[],w[] 分别存一条边的顶点.权值,d ...
- 非负权值有向图上的单源最短路径算法之Dijkstra算法
问题的提法是:给定一个没有负权值的有向图和其中一个点src作为源点(source),求从点src到其余个点的最短路径及路径长度.求解该问题的算法一般为Dijkstra算法. 假设图顶点个数为n,则针对 ...
- 图之单源Dijkstra算法、带负权值最短路径算法
1.图类基本组成 存储在邻接表中的基本项 /** * Represents an edge in the graph * */ class Edge implements Comparable< ...
随机推荐
- MySQL备忘点(上)
给自己看的,所以以举例子为主了 检索数据 SELECT 检索单列 SELECT name FROM student 检索多列 SELECT no, name FROM student 检索所有列 S ...
- 我好菜系列——map查找
链接:https://ac.nowcoder.com/acm/contest/931/A来源:牛客网 DNA序列里只有ACGT四种字母,A和T对应,C和G对应. 俩序列完全对应,就是指它们每一位上的字 ...
- Spring Cloud Eureka(六):Eureka Client 如何注册到Eureka Server
1.本节概要 根据前文我们对Eureka Server 有了一定的了解,本节我们主要学习Eureka Client 与 Eureka Server 如何通讯的及相关通信机制是什么,本文会弄清楚一下几个 ...
- Python语法 - 推导式
推导式分为列表推导式(list),字典推导式(dict),集合推导式(set)三种 列表推导式(list comprehension)最擅长的方式就是对整个列表分别做相同的操作,并且返回得到一个新的列 ...
- 异步机制 - Overlapped
1 前面说到 GetOverlappedResult的bWait含义 GetOverlappedResult的bWait含义表示是否需要等待,如果IO还处于PENDING状态,内部大概实现是这样 hO ...
- SpringBoot2.0 Actuator 监控参数说明
主要内容更 监控参数说明 Maven坐标 <dependency> <groupId>org.springframework.boot</groupId> < ...
- 分享一个自己做的SpringMVC的PPT,由于比较忙只写了一些重要的部分
- Qemu搭建ARM vexpress开发环境(一)
Qemu搭建ARM vexpress开发环境(一) 标签(空格分隔): Qemu ARM Linux 嵌入式开发离不开硬件设备比如:开发板.外设等,但是如果只是想学习研究Linux内核,想学习Linu ...
- 使用IDEA来实现分支代码合并
使用beyond comapre进行分支代码的合并是常用的方法,同时比较2个分支的代码,选择需要和入的代码后再提交即可. 如果是不能使用beyond comapre的情况下,使用IDEA的分支比较功能 ...
- JAVA 基础编程练习题20 【程序 20 求前 20 项之和】
20 [程序 20 求前 20 项之和] 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前 20 项之和. 程序分析:请抓住分子与分母的变化规律. pac ...