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=1005,M=2e5+5,INF=1e9;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}int n,m,s,t,g[55][55],u,v,id[55][55],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,0);e[cnt].ne=h[u];h[u]=cnt;cnt++;e[cnt]=Edge(u,-w,0,0);e[cnt].ne=h[v];h[v]=cnt;
}void build(){s=0;t=m+1;for(int i=1;i<n;i++) ins(s,i,0,1);for(int i=n;i<=m;i++) ins(i,t,0,1);for(int i=n;i<=m;i++){p=0;G.dfs(a[i].u,0,a[i].v);//printf("now %d\n",i);//for(int j=1;j<=p;j++) printf("%d ",q[j]);puts("");for(int j=1;j<=p;j++) ins(q[j],i,a[q[j]].w-a[i].w,1);}
}int d[N],head,tail,inq[N],pre[N],pos[N];
inline void lop(int &x){if(x==N)x=1;}
bool spfa(){//memset(d,127,sizeof(d));for(int i=s;i<=t;i++) d[i]=-INF,inq[i]=0;//memset(inq,0,sizeof(inq));head=tail=1;d[s]=0;inq[s]=1;q[tail++]=s;pre[t]=-1;while(head!=tail){int u=q[head++];inq[u]=0;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]=1,lop(tail); }}}return pre[t]!=-1;
}
int mcmf(){int flow=0,cost=0;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]<0) 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]-1)^1)+1].f-=f;}}return cost;
}int main(){freopen("in","r",stdin);n=read();m=read(); for(int i=1;i<=m;i++) u=read(),v=read(),g[u][v]=g[v][u]=read();for(int i=1;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=1;i<=n;i++)for(int j=i+1;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());
}

 

转载于:https://www.cnblogs.com/candy99/p/6536591.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

找bug

1.在输入数据按保存键后不知道数据是否已经存入数据库。 修改&#xff1a;增加一个对数据库的监听事件来监听数据库是否发生变化。 2.空数据也能保存成功。 修改&#xff1a;增加一个监听事件来检测是否输入数据。 3.在输入框中输入不否和输入框对数据的要求&#xff0c;但不提…

HALCON示例程序forest.hdev识别森林中的树

HALCON示例程序forest.hdev识别森林中的树 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 dev_close_window () dev_update_window (‘off’) read_image (Forest, ‘forest_air1’) get_image_size (Forest, Width, Height) dev_open_window (0, 0, Width…

Hadoop学习之路(十八)MapReduce框架Combiner分区

对combiner的理解 combiner其实属于优化方案&#xff0c;由于带宽限制&#xff0c;应该尽量map和reduce之间的数据传输数量。它在Map端把同一个key的键值对合并在一起并计算&#xff0c;计算规则与reduce一致&#xff0c;所以combiner也可以看作特殊的Reducer。 执行combiner操…

cocos2dx游戏--欢欢英雄传说--添加攻击按钮

接下来添加攻击按钮用于执行攻击动作。同时修复了上一版移动时的bug。修复后的Player::walkTo()函数&#xff1a; void Player::walkTo(Vec2 dest) {if (_seq)this->stopAction(_seq);auto curPos this->getPosition();if (curPos.x > dest.x)this->setFlippedX(t…

Yii2.0 rules常用验证规则

设置一个修改方法&#xff0c;但是save&#xff08;&#xff09;&#xff0c;没有成功&#xff0c;数据修改失败&#xff0c;查了好久&#xff0c;一般情况就是不符合rules规则&#xff0c;而我没有设置rules规则&#xff0c;重新设置了一个不能为空&#xff0c;然后就修改成功…

HALCON示例程序gray_features.hdev提取灰度图的不同特征(area_center_gray 、elliptic_axis_gray)

HALCON示例程序gray_features.hdev提取灰度图的不同特征&#xff08;area_center_gray 、elliptic_axis_gray&#xff09; 示例程序源码&#xff08;加注释&#xff09; 读入图片 read_image (Image, ‘monkey’)二值化 threshold (Image, Region, 128, 255)分割连通域 conne…

Machine Vision Pixel Calibration~ ~ ~ ~ ~ ~ ~ ~ ~ ~

Artificial Intelligence and Robotics Research人工智能与机器人研究, 2014, 3, 25-33Published Online May 2014 in Hans. http://www.hanspub.org/journal/airrhttp://dx.doi.org/10.12677/airr.2014.32005

Ceph分布式存储系统-性能测试与优化

测试环境 部署方案&#xff1a;整个Ceph Cluster使用4台ECS&#xff0c;均在同一VPC中&#xff0c;结构如图&#xff1a; 以下是 Ceph 的测试环境&#xff0c;说明如下&#xff1a; Ceph 采用 10.2.10 版本&#xff0c;安装于 CentOS 7.4 版本中&#xff1b;系统为初始安装&…

mysql考试总结

USE school; -- 班级表 CREATE TABLE class(cid TINYINT PRIMARY KEY AUTO_INCREMENT,caption VARCHAR(20) );INSERT INTO class(caption) VALUES("三年二班"),("一年三班"),("三年一班");SELECT * FROM class;-- 老师表 CREATE TABLE teacher(t…

反思

1.说明一下ArrayList和数组的区别&#xff0c;并且分别写出初始化的语句&#xff1a; ArrayList:可以放不同的类型&#xff0c;长度不固定 数组&#xff1a;放同一类型&#xff0c;长度固定 数组的初始化语句&#xff1a;int []anew int []{}; ArrayList初始化语句&#xff1a;…

HALCON示例程序high.hdev使用不同方法提取区域

HALCON示例程序high.hdev使用不同方法提取区域 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 dev_close_window () read_image (Mreut, ‘mreut_y’) get_image_size (Mreut, Width, Height) dev_open_window (0, 0, Width, Height, ‘black’, WindowHan…

阅读好书依然是提升自己的高效方法:兼以作者的身份告诉大家如何选择书,以及高效学习的方法...

国内技术网站多如牛毛&#xff0c;质量高的网站也不少&#xff0c;博客园也算一个&#xff0c;各类文章数以百万计&#xff0c;我随便输入一个关键字&#xff0c;比如Spring Cloud&#xff0c;都能看到大量的技术文章和教学视频&#xff0c;我无意贬低技术文章和教学视频的作用…

TCP/IP 协议簇的逐层封装

在使用 TCP 协议的网络程序中&#xff0c;用户数据从产生到从网卡发出去一般要经过如下的逐层封装过程&#xff1a; 从下往上看&#xff1a; 1&#xff09;链路层通过加固定长度的首部、尾部来封装 IP 数据报(Datagram) 产生以太网帧(Frame)。 其中首部存在对封装数据的…

【开源程序(C++)】获取bing图片并自动设置为电脑桌面背景

众所周知&#xff0c;bing搜索网站首页每日会更新一张图片&#xff0c;张张漂亮&#xff08;额&#xff0c;也有一些不合我口味的&#xff09;&#xff0c;特别适合用来做电脑壁纸。 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是&#xff1a; 上网&#xff0c;搜…

UIProgressView 圆角

里面外面都变成圆角 不用图片 直接改变layer 重点是里面外面都是圆角哦 for (UIImageView * imageview in self.progress.subviews) { imageview.layer.cornerRadius 5; imageview.clipsToBounds YES; } 转载于:https://www.cnblogs.com/huoran1120/p/5563991.html

HALCON示例程序holes.hdev孔洞提取

HALCON示例程序holes.hdev孔洞提取 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 read_image (Image, ‘progres’) get_image_size (Image, Width, Height) dev_close_window () dev_open_window (0, 0, Width, Height, ‘white’, WindowID) dev_set_co…

给实例动态增加方法VS给类动态增加方法

一、给实例绑定方法 object.method MethodType(method,object) >>>class Badbrains(): pass >>>def mocking(self): print(Brain\s Mocking) >>>b Badbrains() >>>from types import MethodType >>>b.mocking MethodType(moc…

一句DOS命令搞定文件合并

用Dos的copy命令实现&#xff1a; copy a.jsb.jsc.js abc.js /b 将 a.js b.js c.js 合并为一个 abc.js&#xff0c;最后的 /b 表示文件为二进位文件&#xff0c;copy 命令的其它参数可以在 cmd 里输入 copy /? 学习 举例&#xff1a;如果想要合并多个js文件到某个目录下&#…

DataTables warning: Requested unknown parameter '0' from the data source for row '0'

问题&#xff1a;DataTables warning: Requested unknown parameter 0 from the data source for row 0 代码&#xff1a; <script type"text/javascript">var data [{"Name":"UpdateBootProfile","Result":"PASS",&…

HALCON示例程序hull.hdev区域提取与凸度筛选

HALCON示例程序hull.hdev区域提取与凸度筛选 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 read_image (Hull, ‘hull’) get_image_size (Hull, Width, Height) dev_close_window () dev_open_window (0, 0, Width, Height, ‘black’, WindowID) dev_di…