对于树边显然只需要减少权值,对于非树边显然只需要增加权值

设i不为树边,j为树边

X[i]:i增加量

X[j]:j减少量

C[i]:修改1单位i的代价

对于每条非树边i(u,v),在树上u到v路径上的所有边j都需要满足

$W_i+X_i\geq W_j-X_j$

$X_i+X_j\geq W_j-W_i$

最后我们要最小化$\sum C_iX_i$

将矩阵转置,得到对偶问题,用线性规划单纯形法求解

#include<cstdio>
#define rep(i,l,n) for(int i=l;i<=n;i++)
const int N=1001,M=4000,inf=~0U>>2;
int n,m,a[N][M],nxt[M],s,t,c,nn;
int g[N],Nxt[N],v[N],ed,pre[N],id[N][N],head,tail,q[N];
inline void cal(int l,int e){
a[l][e]=-1;t=M-1;
rep(i,0,m)if(a[l][i])nxt[t]=i,t=i;nxt[t]=-1;
rep(i,0,n)if(i!=l&&(t=a[i][e])){
a[i][e]=0;
for(int j=nxt[M-1];~j;j=nxt[j])a[i][j]+=a[l][j]*t;
}
}
int work(){
for(;;){int min=inf,l=0,e=0;
rep(i,1,m)if(a[0][i]>0){e=i;break;}
if(!e)return a[0][0];
rep(i,1,n)if(a[i][e]<0&&a[i][0]<min)min=a[i][0],l=i;
cal(l,e);
}
}
struct Edge{int u,v,w,f,a,b,c;}E[N];
inline void add(int x,int y,int z){v[++ed]=y;id[x][y]=z;Nxt[ed]=g[x];g[x]=ed;}
inline void bfs(int X,int y,int z){
int i,x;
for(i=1;i<=nn;i++)pre[i]=0;
q[head=tail=0]=X;
while(head<=tail)for(i=g[x=q[head++]];i;i=Nxt[i])if(!pre[v[i]]&&v[i]!=X)pre[q[++tail]=v[i]]=x;
for(;pre[y];y=pre[y]){
++m;
i=id[y][pre[y]];
a[z][m]=a[i][m]=-1;
a[0][m]=E[i].w-E[z].w;
}
}
int main(){
scanf("%d%d",&nn,&n);
rep(i,1,n){
scanf("%d%d%d%d%d%d",&E[i].u,&E[i].v,&E[i].w,&E[i].f,&E[i].a,&E[i].b);
E[i].c=E[i].f?E[i].b:E[i].a;
if(E[i].f)add(E[i].u,E[i].v,i),add(E[i].v,E[i].u,i);
}
rep(i,1,n)if(!E[i].f)bfs(E[i].u,E[i].v,i);
rep(i,1,n)a[i][0]=E[i].c;
return printf("%d",work()),0;
}

  

BZOJ3118 : Orz the MST的更多相关文章

  1. BZOJ3118 Orz the MST 【单纯形 + 生成树】

    题目链接 BZOJ3118 题解 少有的单纯形好题啊 我们先抽离出生成树 生成树中的边只可能减,其它边只可能加 对于不在生成树的边,其权值一定要比生成树中其端点之间的路径上所有的边都大 然后就是一个最 ...

  2. bzoj3118: Orz the MST(线性规划+单纯形法)

    传送门 不难发现,对于每一条树边肯定要减小它的权值,对于每一条非树边要增加它的权值 对于每一条非树边\(j\),他肯定与某些树边构成了一个环,那么它的边权必须大于等于这个环上的所有边 设其中一条边为\ ...

  3. bzoj 3118: Orz the MST(单纯形)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3118 题意:给出一个图以及图中指定的n-1条边组成的生成树.每条边权值加1或者减去 ...

  4. BZOJ 3118 Orz the MST

    权限题qwq 如果我们要使得某棵生成树为最小生成树,那么上面的边都不能被替代,具体的,对于一个非树边,它的权值要\(\ge\)它两端点在树上的路径上的所以边的权值,所以对于每个非树边就可以对一些树边列 ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. POJ1679The Unique MST(次小生成树)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25203   Accepted: 8995 D ...

  7. HDU5627--Clarke and MST (bfs+位运算)

    http://www.cnblogs.com/wenruo/p/5188495.html Clarke and MST Time Limit: 2000/1000 MS (Java/Others) M ...

  8. MST系列

    1.POJ2485 Highways 蛮水的 数组一开始开小了卡了一会儿 我可能是个傻逼 #include<iostream> #include<cstdio> #includ ...

  9. poj 1639 Picnic Planning 度限制mst

    https://vjudge.net/problem/POJ-1639 题意: 有一群人,他们要去某一个地方,每个车可以装无数个人,给出了n条路,包含的信息有路连接的地方,以及路的长度,路是双向的,但 ...

随机推荐

  1. C++中的复制、赋值、析构

    一直对C++的复制(Copy).赋值(Assign)操作比较困惑,现在看书的时候看到了,就把它顺便记下来. 一.什么时候触发 一下代码可以熟悉什么时候触发复制操作,以及什么时候触发赋值操作: // t ...

  2. DCMTK开源库的学习笔记4:利用ini配置文件对dcm影像进行归档

    转:http://blog.csdn.net/zssureqh/article/details/8846337 背景介绍: 医学影像PACS工作站的服务端需要对大量的dcm文件进行归档,写入数据库处理 ...

  3. 【JavaScript】ReactJS&NodeJS了解资料

    ReactJS: GitHub:https://github.com/facebook/react React 入门实例教程:http://www.ruanyifeng.com/blog/2015/0 ...

  4. 【leetcode】Excel Sheet Column Number

    Excel Sheet Column Number Related to question Excel Sheet Column Title Given a column title as appea ...

  5. CHM文档打开空白的解决

    网上打包的CHM格式的文档,有时候打开无论点击目录哪一章节都会出现一片空白或者显示已取消到该网页的导航 这个情况的原因就是CHM文件在Windows的HTFS文件系统中会默认被阻止显示,解决方法就是在 ...

  6. July 15th, Week 29th Friday, 2016

    A book is a gift that you can open again and again. 书是你可以一次又一次打开的礼物. Some gifts are born with you, a ...

  7. C++拷贝构造函数(深拷贝,浅拷贝)

    http://www.cnblogs.com/BlueTzar/articles/1223313.html 对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a;  ...

  8. Android主题换肤实现

    本系列文章主要是对一个Material Design的APP的深度解析,主要包括以下内容 基于Material Design Support Library作为项目整体框架.对应博文:Android ...

  9. SQL 外键

    先新建2个表,写入数据 -- 创建测试主表. ID 是主键. CREATE TABLE test_main ( id INT, value ), PRIMARY KEY(id) ); -- 创建测试子 ...

  10. 如何从本地把项目上传到github

    在本地项目所在目录按以下步骤操作 echo # test >> README.md git init git add README.md git add . git commit -m . ...