BZOJ 1937: [Shoi2004]Mst 最小生成树 [二分图最大权匹配]
题意:
给一张无向图和一棵生成树,改变一些边的权值使生成树为最小生成树,代价为改变权值和的绝对值,求最小代价
线性规划的形式:
$Min\quad \sum\limits_{i=1}^{m} \delta_i$
$Sat\quad $非树边边权$\ge$生成树上路径任何一条边的边权
$i$非树边$j$树边
$w_i+\delta_i \ge w_j-\delta_j$
然后可以转化成二分图最小顶标和来求解
这里需要求二分图最大权非完美匹配,我的做法是遇到$d[t] < 0$就退出,反正这道题过了
然后很高兴的$1A$了就去看金刚狼3了好感动 现在补题解...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=,M=2e5+,INF=1e9;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int n,m,s,t,g[][],u,v,id[][],num;
struct data{int u,v,w;}a[M]; int q[N],p;
struct Graph{
struct edge{int v,ne;}e[M];
int cnt,h[N];
inline void ins(int u,int v){
cnt++;
e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;
cnt++;
e[cnt].v=u;e[cnt].ne=h[v];h[v]=cnt;
}
bool dfs(int u,int fa,int tar){
if(u==tar) return true;
for(int i=h[u];i;i=e[i].ne)
if(e[i].v!=fa){
q[++p]=id[u][e[i].v];
if(dfs(e[i].v,u,tar)) return true;
p--;
}
return false;
}
}G; struct Edge{
int v,ne,w,c,f;
Edge(){}
Edge(int v,int w,int c,int f):v(v),w(w),c(c),f(f){}
}e[M];
int cnt,h[N];
inline void ins(int u,int v,int w,int c){//printf("ins %d %d %d %d\n",u,v,w,c);
cnt++;
e[cnt]=Edge(v,w,c,);e[cnt].ne=h[u];h[u]=cnt;
cnt++;
e[cnt]=Edge(u,-w,,);e[cnt].ne=h[v];h[v]=cnt;
} void build(){
s=;t=m+;
for(int i=;i<n;i++) ins(s,i,,);
for(int i=n;i<=m;i++) ins(i,t,,);
for(int i=n;i<=m;i++){
p=;
G.dfs(a[i].u,,a[i].v);
//printf("now %d\n",i);
//for(int j=1;j<=p;j++) printf("%d ",q[j]);puts("");
for(int j=;j<=p;j++) ins(q[j],i,a[q[j]].w-a[i].w,);
}
} int d[N],head,tail,inq[N],pre[N],pos[N];
inline void lop(int &x){if(x==N)x=;}
bool spfa(){
//memset(d,127,sizeof(d));
for(int i=s;i<=t;i++) d[i]=-INF,inq[i]=;
//memset(inq,0,sizeof(inq));
head=tail=;
d[s]=;inq[s]=;q[tail++]=s;
pre[t]=-;
while(head!=tail){
int u=q[head++];inq[u]=;lop(head);
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v,w=e[i].w;
if(d[v]<d[u]+w&&e[i].c>e[i].f){
d[v]=d[u]+w;
pre[v]=u;pos[v]=i;
if(!inq[v])q[tail++]=v,inq[v]=,lop(tail);
}
}
}
return pre[t]!=-;
}
int mcmf(){
int flow=,cost=;
while(spfa()){
int f=INF;
for(int i=t;i!=s;i=pre[i]) f=min(f,e[pos[i]].c-e[pos[i]].f);
flow+=f;
if(d[t]<) break;
cost+=d[t]*f;//printf("%d %d %d\n",f,d[t],cost);
for(int i=t;i!=s;i=pre[i]){
e[pos[i]].f+=f;
e[((pos[i]-)^)+].f-=f;
}
}
return cost;
} int main(){
freopen("in","r",stdin);
n=read();m=read();
for(int i=;i<=m;i++)
u=read(),v=read(),g[u][v]=g[v][u]=read();
for(int i=;i<n;i++)
u=read(),v=read(),id[u][v]=id[v][u]=++num,a[num]=(data){u,v,g[u][v]},G.ins(u,v);
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
if(g[i][j]&&!id[i][j]) id[i][j]=id[j][i]=++num,a[num]=(data){i,j,g[i][j]};
//printf("lo %d %d %d\n",i,j,num); build();
printf("%d\n",mcmf());
}
BZOJ 1937: [Shoi2004]Mst 最小生成树 [二分图最大权匹配]的更多相关文章
- [BZOJ 1937][Shoi2004]Mst 最小生成树
传送门 $ \color{red} {solution:} $ 对于每条树边\(i\),其边权只可能变小,对于非树边\(j\),其边权只可能变大,所以对于任意非树边覆盖的树边有 \(wi - di & ...
- [BZOJ1937][SHOI2004]Mst最小生成树(KM算法,最大费用流)
1937: [Shoi2004]Mst 最小生成树 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 802 Solved: 344[Submit][Sta ...
- 【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)
[BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的 ...
- POJ2195 Going Home[费用流|二分图最大权匹配]
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22088 Accepted: 11155 Desc ...
- Hdu2255 奔小康赚大钱(二分图最大权匹配KM算法)
奔小康赚大钱 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好 ...
- [ACM] HDU 2255 奔小康赚大钱 (二分图最大权匹配,KM算法)
奔小康赚大钱 Problem Description 传说在遥远的地方有一个很富裕的村落,有一天,村长决定进行制度改革:又一次分配房子. 这但是一件大事,关系到人民的住房问题啊. 村里共同拥有n间房间 ...
- POJ2195 Going Home (最小费最大流||二分图最大权匹配) 2017-02-12 12:14 131人阅读 评论(0) 收藏
Going Home Description On a grid map there are n little men and n houses. In each unit time, every l ...
- HDU2255 奔小康赚大钱 —— 二分图最大权匹配 KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) ...
- 二分图最大权匹配——KM算法
前言 这东西虽然我早就学过了,但是最近才发现我以前学的是假的,心中感慨万千(雾),故作此篇. 简介 带权二分图:每条边都有权值的二分图 最大权匹配:使所选边权和最大的匹配 KM算法,全称Kuhn-Mu ...
随机推荐
- Spark环境搭建(中)——Hadoop安装
1. 下载Hadoop 1.1 官网下载Hadoop http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.9.0/hadoop-2. ...
- spring中用到的设计模式
http://www.cnblogs.com/pengmengnan/p/6717766.html 一 : 工厂模式工厂模式主要是为创建对象提供过度接口,以便将创建对象的具体 过程屏蔽隔离起来,达到提 ...
- JAVA开发中遇到的异常总结
最常见的五种异常:必会,面试题: 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数 ...
- 01-01_环境准备_pyenv
本文重点: 了解pyenv pyenv下载及安装 pyenv 使用 安装ipython 一.了解pyenv 经常遇到这样的情况: 系统自带的 Python 是 2.6,自己需要 Python 2.7 ...
- [20160711][neven代码移植Windows]
相关说明 neven代码用于人脸检测,该代码是从Android源代码中抽取出来的,可以在Linux系统下通过make命令直接进行编译,并且可以通过代码中opencv目录下的测试文件进行测试. 移植环境 ...
- Spider_Man_5.2 の Mongodb_使用
一:简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库1.易用性 MongoDB是一个面向文档(document-oriented)的数据库,而不是关系型数据库.不采用关系型主要是为了获得 ...
- Laravel5中使用阿里大于(鱼)发送短信验证码
在做用户注册和个人中心的安全管理时,我实现借助第三方短信平台(阿里大于(鱼))在Laravel框架中进行手机验证的设置:阿里大于,是阿里通信旗下优质便捷的云通信服务平台,整合了三大运营商的通信能力,为 ...
- windows 防火墙拦截nginx的问题
今天在azure vm上安装了nginx并配置了代理设置,但域名访问始终无法中转,一开始怀疑是nginx的服务没起来,但在本地访问localhost看下如下界面,证明服务是没问题的. 本地访问没问题, ...
- HTML meta refresh 刷新与跳转(重定向)页面
下面为各位整理了一些HTML meta refresh 刷新与跳转(重定向)页面的例子吧,后面本站长自己也补充了一些js页面刷新与跳转例子吧. refresh 属性值 -- 刷新与跳转(重定向)页 ...
- JFinal极速开发框架使用笔记(四) _JFinalDemoGenerator实体类生成及映射自动化
运行_JFinalDemoGenerator生成实体类和映射之前的项目结构: 运行之后: 生成和改变的文件: 实体类: package com.wazn.model; import com.wazn. ...