题意:链接

方法:线性规划

解析:

这道题我也是orz了。

刚开始脑抽,仅仅是认为所有标号为1的边都比标号为0的边小即可。

后来与140142讨论了下发现我俩都犯好sb的错误=-=

这个图也是建了一阵子。

回忆之前做过的有关一个无向联通图中,一个边在最小生成树上,必要条件是该边构成的环中,这一边一定不是最大值。

这样的话,题中既然给了在树上的边。

并且很显然树上的边只能增加,不在树上的边只能减小。

所以我们不妨设XiX_i代表第i条边的变化值

那么我们可以重新显然定义代价CiC_i。

结合之前的结论

编号为j的标号为0的一条边,与树中的i,k边形成环。

则有如下限制

Xj+Wj>=Wi−XiX_j+W_j>=W_i-X_i

Xj+Wj>=Wk−XkX_j+W_j>=W_k-X_k

Xi+Xj>=Wi−WjX_i+X_j>=W_i-W_j

Xk+Xj>=Wk−WjX_k+X_j>=W_k-W_j

我们可以列出所有诸如此类的限制,并且对于本题的数据,该限制不超过4000。

我们的目标函数是什么?

最小化∑mi=1Xi∗Ci\sum_{i=1}^{m}X_i*C_i

这种形式是不是有点眼熟?

是的,直接用对偶原理即可求解。


然而,该题仍有一种较神的写法博主没有写过

就是这种没有基本可行解的线性规划,我们可以设一个辅助变量来求解。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 310
#define M 1010
#define INF 0x7f7f7f7f
using namespace std;
double a[M][M<<2];
int st[N];
struct line
{int u,v,w,ff,a,b;
}l[M];
int head[N],cnt,n,m,top,tot;
struct node
{int from,to,ff,no,a,b,next;
}edge[M<<1];
void init()
{memset(head,-1,sizeof(head));cnt=1;
}
void edgeadd(int from,int to,int ff,int no)
{edge[cnt].from=from,edge[cnt].to=to,edge[cnt].ff=ff,edge[cnt].no=no;edge[cnt].next=head[from];head[from]=cnt++;
}
void dfs(int now,int fa,int e,int edge0)
{if(now==e){while(top){tot++;int no=st[top--];a[no][tot]=1;a[edge0][tot]=1;a[0][tot]=l[no].w-l[edge0].w;}return;}for(int i=head[now];i!=-1;i=edge[i].next){int to=edge[i].to;if(to==fa)continue;st[++top]=edge[i].no;dfs(to,now,e,edge0);st[top--]=0;}
}
int check()
{for(int i=1;i<=tot;i++)if(a[0][i]>0)return i;return 0;
}
void Simplex()
{while(int t=check()){double limit=INF;int choseline;for(int i=1;i<=m;i++){if(a[i][t]<=0)continue;else if(a[i][0]/a[i][t]<limit)limit=a[i][0]/a[i][t],choseline=i;}if(limit==INF){a[0][0]=INF;break;}double di=a[choseline][t];for(int i=0;i<=tot;i++){if(i==t)a[choseline][i]/=di;a[choseline][i]/=di;}for(int i=0;i<=m;i++){if(i==choseline||a[i][t]==0)continue;if(i==0)a[i][0]+=a[i][t]*a[choseline][0];else a[i][0]-=a[i][t]*a[choseline][0];double l=a[i][t];for(int j=1;j<=tot;j++){if(j==t)a[i][j]=-l*a[choseline][j];else a[i][j]-=l*a[choseline][j];}}}
}
int main()
{init();scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int u,v,w,ff,A,b,no;scanf("%d%d%d%d%d%d",&u,&v,&w,&ff,&A,&b);l[i].u=u,l[i].v=v,l[i].w=w,l[i].ff=ff,l[i].a=A,l[i].b=b;if(ff)a[i][0]=b;else a[i][0]=A;if(ff)edgeadd(u,v,ff,i),edgeadd(v,u,ff,i);}for(int i=1;i<=m;i++){if(l[i].ff==0){top=0;dfs(l[i].u,0,l[i].v,i);}}Simplex();printf("%.0lf\n",a[0][0]);
}

BZOJ 3118 Orz the MST 线性规划相关推荐

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

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

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

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

  3. BZOJ3118 : Orz the MST(对偶费用流)

    题目我已经3个月登不上BZOJ了,该不会真的炸了吧 对于线性规划对偶这一套不熟悉的同学可以看我的这篇博客最后你会发现我还是在让你去看集训队论文 对于我们需要的最小生成树,首先树边只会减小,非树边只会增 ...

  4. bzoj-3118 Orz the MST

    题意: 给出一个无向连通图,并指定其中一颗生成树: 每条边上有一个权值vali,如果增大这个权值1则花费Ai,减小1花费Bi: 现在要使指定的生成树为一颗最小生成树,求最小花费: n<=300, ...

  5. bzoj3118 Orz the MST(单纯形)

    Description 给出一个带权的连通无向图,对于其中的每条边i,在原来边权的基础上,其边权每增加1需要付出的代价为Ai,边权每减少1需要付出的代价为Bi,现在指定该图的一棵生成树,求通过修改边权 ...

  6. BZOJ3118 : Orz the MST

    对于树边显然只需要减少权值,对于非树边显然只需要增加权值 设i不为树边,j为树边 X[i]:i增加量 X[j]:j减少量 C[i]:修改1单位i的代价 对于每条非树边i(u,v),在树上u到v路径上的 ...

  7. bzoj3118 Orz the MST

    题目链接:bzoj3118 题目大意: 给出一个带权的连通无向图,对于其中的每条边i,在原来边权的基础上,其边权每增加1需要付出的代价为Ai,边权每减少1需要付出的代价为Bi,现在指定该图的一棵生成树 ...

  8. BZOJ1937 / BZOJ 3118(单纯形)

    传送门 题解: KM?网络流建模?不存在的. 单纯形立水之. (注意对偶之后跑得更快,取反大概要慢8倍). BZOJ3118: #include <bits/stdc++.h> using ...

  9. [BZOJ3118]Orz the MST(单纯形)

    题目描述 传送门 题解 这题我的方法好蠢啊 令xix_i表示第i条边增加了几次,yiy_i表示第i条边减少了几次,那么目标函数就是最小化∑Ai∗xi+Bi∗yi\sum A_i*x_i+B_i*y_i ...

最新文章

  1. iOS开发-NSString去掉所有换行及空格
  2. linux命令 把文件夹拷贝一遍_cp 快捷命令:复制文件到多个目录
  3. 上篇 | 说说无锁(Lock-Free)编程那些事
  4. Mac 安装redis
  5. 江小白包装设计原型_雪碧和江小白的品牌跨界合作之旅可谓是一场品牌包装的视觉盛宴...
  6. C++学习之路 | PTA乙级—— 1082 射击比赛 (20 分)(精简)
  7. mysql 类似 oracle connect by,mysql中实现相仿oracle的SYS_CONNECT_BY_PATH功能
  8. linux ntfs 3g6,CentOS6挂载读写NTFS分区(ntfs-3g)
  9. 离线在线计算机系统,离线计算机系统
  10. Destroying The Graph 最小点权集--最小割--最大流
  11. 90后程序猿失业倒计时,还剩4年时间!!!
  12. 【其他】vue项目集成富文本编辑器
  13. java 移位运算符_Java的移位运算符
  14. 全国基础地理数据库数据预处理
  15. matlab分位数回归,分位数回归及其实例
  16. 程序员面试必问:你为什么要离开上一家公司。你会怎么回答?
  17. 伪随机数的产生和流密码
  18. 朱松纯教授:可解释性是人工智能获得人类信任的关键
  19. spring启动流程(一):启动流程概览
  20. 而洗洁精膜会有效地保持玻璃2小时内不结霜

热门文章

  1. 服务器硬盘和外储硬盘接口,服务器硬盘和普通硬盘有什么区别?
  2. 【Redis学习笔记】13.Redis 主从复制
  3. 一个半路出家十年Java老程序员的真实经历
  4. 苹果关闭iOS 16和16.0.1验证通道,升级iOS 16.0.2后无法降级这2版本
  5. 02-【实操】神策埋点实施的全流程实操与经验分享
  6. python程序员面试宝典 陈屹_Python 面试宝典
  7. 北京程序员踩出的“雪地佩奇”今天火了!女白领写下“求对象”
  8. 省市县JSON数据ppca-code.json
  9. U-Boot-2009.8在Mini2440上的移植--支持128MB大页NandFLash(一)
  10. win10一直卡在自动修复_手把手教你优化win10系统。