传送门

题意:

给一张无向图和一棵生成树,改变一些边的权值使生成树为最小生成树,代价为改变权值和的绝对值,求最小代价


线性规划的形式:

$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

BZOJ 1937: [Shoi2004]Mst 最小生成树 [二分图最大权匹配]相关推荐

  1. 【算法笔记】二分图最大权匹配 - KM算法(dfs版O(n4) + bfs版O(n3))

    整理的算法模板合集: ACM模板 匈牙利算法又称为 KM 算法,可以在 O(n3)O(n^3)O(n3) 时间内求出二分图的 最大权完美匹配 . 考虑到二分图中两个集合中的点并不总是相同,为了能应用 ...

  2. UOJ#80 二分图最大权匹配 [模板题]

    从前一个和谐的班级,有 nlnl 个是男生,有 nrnr 个是女生.编号分别为 1,-,nl1,-,nl 和 1,-,nr1,-,nr. 有若干个这样的条件:第 vv 个男生和第 uu 个女生愿意结为 ...

  3. 二分图最大权匹配 KM算法

    KM算法的正确性基于以下定理: 若由二分图中所有满足A[i]+B[i]=w[i][j]的边C(i,j)构成的子图(即相等子图)有完备匹配,那么这个完备匹配就是二分图的最大权匹配 基本概念 1.完备匹配 ...

  4. 二分图最大权匹配问题KM算法讲解 HDU 2255 奔小康赚大钱

    作者:logosG 链接:https://www.cnblogs.com/logosG/p/logos.html (讲解的KM算法,特别厉害!!!) KM算法: 现在我们来考虑另外一个问题:如果每个员 ...

  5. HDU - 2255 奔小康赚大钱(二分图最大权匹配+KM)

    题目链接:点击查看 题目大意:中文题目,简单来说就是n个人和n个房子最大匹配,需要一一对应并且满足权值和最大 题目分析:二分图的完备匹配,条件完全符合KM算法的局限性,直接套模板即可,后续学习费用流( ...

  6. bzoj1937: [Shoi2004]Mst 最小生成树

    也是神了.感觉一天都在好神的题里面游荡. 本来是想复习一下KM的,结果一眼过去??? 结果做法是这样的,把树边和非树边分成两个集合 根据贪心的思想,要搞的话肯定树边减少,而非树边增加. 对于在原树中的 ...

  7. 【KM】BZOJ1937 [Shoi2004]Mst 最小生成树

    这道题拖了好久因为懒,结果1A了,惊讶∑( 口 || [题目大意] 给定一张n个顶点m条边的有权无向图.现要修改各边边权,使得给出n-1条边是这张图的最小生成树,代价为变化量的绝对值.求最小代价之和. ...

  8. uva 11383(二分图最大权匹配)

    题意:一个n*n的矩阵每个格子里有一个正整数w(i,j)你的任务是确定每行一个整数row(i)每列一个整数col(i),对每个格子都有w(i,j)<=row(i)+col(j)所有row(i)和 ...

  9. 【图】二分图最大权匹配

    近代数学选讲的作业,写了五个小时(大部分参考<图论与网络最优化算法>龚劬 编),由于word公式直接粘来会出来乱码所以保存成了图片格式,凑合看吧~~~

最新文章

  1. Visual C++ 2010 使用心得 和帮助文档问题
  2. android 重绘如何能不闪一下屏幕_浏览器渲染机制——重绘重排
  3. 从当前元素继续寻找_云漫圈 | 寻找无序数组的第k大元素
  4. jboss 不适用内置日志_适用于孩子,父母和祖父母的JBoss HornetQ –第1章
  5. 查询linux kafka安装目录,Kafka 1.0.0安装和配置--Linux篇
  6. ffmpeg 0.6.3 代码, 经过我努力,能够在vs 2005 下单步调试代码
  7. 《代码敲不队》第三次作业:团队项目的原型设计
  8. day20---IO流概述
  9. C#资源文件的使用方法
  10. 日处理数据量超10亿:友信金服基于Flink构建实时用户画像系统的实践
  11. elsevier模板通讯作者添加脚注的方法[已解决]
  12. 西部数据移动硬盘哪个型号好_西数移动硬盘哪个系列好?西部数据Blue系列3D进阶高速蓝盘怎么样,质量好吗?...
  13. 原生js实现上拉加载
  14. 未来人类将被AI取代?一文读懂人工智能类型与发展阶段
  15. WLAN设备接入过程
  16. 工具条(Ext.Toolbar)
  17. 制作视频数据集(一):截取视频帧
  18. 64位Ubuntu系统兼容32位程序
  19. 《REWORK》启示录 招聘笔杆子——程序员为什么值得写博客
  20. php esc p 打印,ESC/P 打印指令使用,3种票据打印方法(转)

热门文章

  1. 定期存单丢了被别人捡到,里面的存款会不会被领走?
  2. 17家银行工资单:招行人均45万夺冠
  3. 怎么样从一个疯狂下载者成为一个学习者
  4. python数据处理模块pandas_13. Python|模块总结:Pandas(数据处理)|【老W笔记】...
  5. c++设置单元格填充色_格式函数text,设置自定义格式的万金油
  6. not null primary key什么意思_explain都不会用,你还好意思说精通Mysql查询优化?
  7. noclassdeffounderror java,从终端运行Java文件时出现java.lang.NoClassDefFoundError
  8. 设计师电脑推荐笔记本_笔记本电脑选购推荐全攻略
  9. node linux脚本,用Shell脚本快速搭建Ubuntu下的Nodejs开发环境
  10. 未声明spire。它可能因保护级别而不可访问_信息系统安全:访问控制技术概述...