BZOJ3118 : Orz the MST
对于树边显然只需要减少权值,对于非树边显然只需要增加权值
设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的更多相关文章
- BZOJ3118 Orz the MST 【单纯形 + 生成树】
题目链接 BZOJ3118 题解 少有的单纯形好题啊 我们先抽离出生成树 生成树中的边只可能减,其它边只可能加 对于不在生成树的边,其权值一定要比生成树中其端点之间的路径上所有的边都大 然后就是一个最 ...
- bzoj3118: Orz the MST(线性规划+单纯形法)
传送门 不难发现,对于每一条树边肯定要减小它的权值,对于每一条非树边要增加它的权值 对于每一条非树边\(j\),他肯定与某些树边构成了一个环,那么它的边权必须大于等于这个环上的所有边 设其中一条边为\ ...
- bzoj 3118: Orz the MST(单纯形)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3118 题意:给出一个图以及图中指定的n-1条边组成的生成树.每条边权值加1或者减去 ...
- BZOJ 3118 Orz the MST
权限题qwq 如果我们要使得某棵生成树为最小生成树,那么上面的边都不能被替代,具体的,对于一个非树边,它的权值要\(\ge\)它两端点在树上的路径上的所以边的权值,所以对于每个非树边就可以对一些树边列 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- POJ1679The Unique MST(次小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 25203 Accepted: 8995 D ...
- HDU5627--Clarke and MST (bfs+位运算)
http://www.cnblogs.com/wenruo/p/5188495.html Clarke and MST Time Limit: 2000/1000 MS (Java/Others) M ...
- MST系列
1.POJ2485 Highways 蛮水的 数组一开始开小了卡了一会儿 我可能是个傻逼 #include<iostream> #include<cstdio> #includ ...
- poj 1639 Picnic Planning 度限制mst
https://vjudge.net/problem/POJ-1639 题意: 有一群人,他们要去某一个地方,每个车可以装无数个人,给出了n条路,包含的信息有路连接的地方,以及路的长度,路是双向的,但 ...
随机推荐
- 7 Types of Regression Techniques you should know!
翻译来自:http://news.csdn.net/article_preview.html?preview=1&reload=1&arcid=2825492 摘要:本文解释了回归分析 ...
- Struts2中通配符的使用
1.准备工作 新建一个JavaWeb项目HelloWord,导入Struts2的.jar包,在Web.xml下配置Struts2的监听,在src下添加Struts2的配置文件struts.xml:将该 ...
- Linux 怎么查看服务的启动进程所占用的目录
lsof简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以 ...
- Java基础算法集50题
最近因为要准备实习,还有一个蓝桥杯的编程比赛,所以准备加强一下算法这块,然后百度了一下java基础算法,看到的都是那50套题,那就花了差不多三个晚自习的时间吧,大体看了一遍,做了其中的27道题,有一些 ...
- selec2 clone不起作用。
<table class="table table-bordered"> <thead> <tr> <th width ="16 ...
- 43. 动态规划求解n个骰子的点数和出现概率(或次数)[Print sum S probability of N dices]
[题目] 把N个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入N,打印出S的所有可能的值出现的概率. [分析] 典型的动态规划题目. 设n个骰子的和为s出现的次数记为f(n,s),其中n=[1-N ...
- Cocos2d 初学基本知识
1. 纹理(Texture) 游戏角色的图像文件在使用前必须解压缩,并转换成 iPhone 和 iPad 的 GPU 可以理解的 格式,同时要加载进 RAM(随机存储器),这样的图像称为纹理.GPU ...
- CI框架初探
2014年7月3日 17:39:35 简易版: index.php->codeIgniter.php->找到控制器类文件并include->创建实例->执行成员函数 详细版本: ...
- Java for LeetCode 046 Permutations
Given a collection of numbers, return all possible permutations. For example, [1,2,3] have the follo ...
- fedora yum 使用代理的方法
配置yum: 编辑/etc/yum.conf添加下列一行: proxy=http://domain/user:passwd@<proxy ip>:80 <proxy ip>:代 ...