BZOJ3118 Orz the MST 【单纯形 + 生成树】
题目链接
题解
少有的单纯形好题啊
我们先抽离出生成树
生成树中的边只可能减,其它边只可能加
对于不在生成树的边,其权值一定要比生成树中其端点之间的路径上所有的边都大
然后就是一个最小化的线性规划
为了防止限制过多
我们只需对原先生成树中的比该边大的边建立限制即可
然后就是单纯形 + 对偶
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define cls(s,v) memset(s,v,sizeof(s))
#define mp(a,b) make_pair<int,int>(a,b)
#define cp pair<int,int>
using namespace std;
const int maxn = 1005,maxm = 10005,NN = 1005;
const double eps = 1e-10,INF = 1e15;
inline int read(){
	int out = 0,flag = 1; char c = getchar();
	while (c < 48 || c > 57){if (c == '-') flag = 0; c = getchar();}
	while (c >= 48 && c <= 57){out = (out << 1) + (out << 3) + c - 48; c = getchar();}
	return flag ? out : -out;
}
int h[maxn],ne = 1;
struct EDGE{int to,nxt,id;}ed[maxn << 1];
inline void build(int u,int v,int id){
	ed[++ne] = (EDGE){v,h[u],id}; h[u] = ne;
	ed[++ne] = (EDGE){u,h[v],id}; h[v] = ne;
}
int n,m,N,M;
int dep[maxn],fa[maxn],id[maxn];
int U[NN],V[NN],W[NN],F[NN],A[NN],B[NN];
double a[maxn][maxm];
void dfs(int u){
	Redge(u) if ((to = ed[k].to) != fa[u]){
		fa[to] = u; dep[to] = dep[u] + 1; id[to] = ed[k].id;
		dfs(to);
	}
}
void Pivot(int l,int e){
	double t = a[l][e]; a[l][e] = 1;
	for (int j = 0; j <= n; j++) a[l][j] /= t;
	for (int i = 0; i <= m; i++) if (i != l && fabs(a[i][e]) > 0){
		t = a[i][e]; a[i][e] = 0;
		for (int j = 0; j <= n; j++)
			a[i][j] -= a[l][j] * t;
	}
}
void simplex(){
	while (true){
		int l = 0,e = 0; double mn = INF;
		for (int j = 1; j <= n; j++) if (a[0][j] > eps){e = j; break;}
		if (!e) break;
		for (int i = 1; i <= m; i++) if (a[i][e] > eps && a[i][0] / a[i][e] < mn)
			mn = a[i][0] / a[i][e],l = i;
		Pivot(l,e);
	}
}
int main(){
	N = read(); M = read();
	REP(i,M){
		U[i] = read(); V[i] = read(); W[i] = read();
		F[i] = read(); A[i] = read(); B[i] = read();
		if (F[i]) build(U[i],V[i],i);
	}
	dfs(1);
	n = M;
	REP(i,M){
		if (F[i]) a[i][0] = B[i];
		else{
			a[i][0] = A[i];
			int u = U[i],v = V[i],x;
			while (u != v){
				if (dep[u] < dep[v]) swap(u,v);
				x = id[u];
				if (W[x] > W[i]){
					m++;
					a[x][m] = a[i][m] = 1;
					a[0][m] = W[x] - W[i];
				}
				u = fa[u];
			}
		}
	}
	swap(n,m);
	simplex();
	printf("%.0lf\n",-a[0][0]);
	return 0;
}
												
											BZOJ3118 Orz the MST 【单纯形 + 生成树】的更多相关文章
- BZOJ3118 : Orz the MST
		
对于树边显然只需要减少权值,对于非树边显然只需要增加权值 设i不为树边,j为树边 X[i]:i增加量 X[j]:j减少量 C[i]:修改1单位i的代价 对于每条非树边i(u,v),在树上u到v路径上的 ...
 - 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\)它两端点在树上的路径上的所以边的权值,所以对于每个非树边就可以对一些树边列 ...
 - CISCO交换机STP实验(生成树协议)
		
目录 一.前言:生成树协议(STP) 二.CISCO交换机STP命令汇总 三.运用STP搭建简单拓扑 四.实战:STP综合实验 五.结语 一.前言:生成树协议(STP) 计算机网络中,我们为了减少网络 ...
 - bzoj AC倒序
		
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
 - [ An Ac a Day ^_^ ][kuangbin带你飞]专题八 生成树 POJ 1679 The Unique MST
		
求最小生成树是否唯一 求一遍最小生成树再求一遍次小生成树 看看值是否相等就可以 #include<cstdio> #include<iostream> #include< ...
 - HDU 5627 Clarke and MST &意义下最大生成树 贪心
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5627 题意:Bestcoder的一道题,让你求&意义下的最大生成树. 解法: 贪心,我们从高位 ...
 - NOI模拟题4 Problem A: 生成树(mst)
		
Solution 我们考虑答案的表达式: \[ ans = \sqrt{\frac{\sum_{i = 1}^{n - 1} (w_i - \overline{w})^2}{n - 1}} \] 其中 ...
 
随机推荐
- prop和attr的比较
			
prop来获取或设置固有属性 removeProp() 删除固有属性 attr来获取或设置自定义属性 removeAttr() 删除自定义属性 案例:全选与全不选 <body> ...
 - Spring Boot(十八):使用 Spring Boot 集成 FastDFS
			
上篇文章介绍了如何使用 Spring Boot 上传文件,这篇文章我们介绍如何使用 Spring Boot 将文件上传到分布式文件系统 FastDFS 中. 这个项目会在上一个项目的基础上进行构建. ...
 - Visual Studio2017 Remote Debugger
			
前言 大家在使用vs打包后的文件部署到服务器后,有时候我们需要对线网的后台进行调试.但是它不像在VS中.这个时候我们该怎么调试呢? 微软想到了这一点,他们在 VS 中给我们提供了一个功能: Remot ...
 - 四则运算    C 语言
			
#include<stdio.h>void main(){ char c; float x,y; int result; scanf("%c %f %f",&c ...
 - 《Linux内核设计与分析》第六周读书笔记——第三章
			
<Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作 ...
 - Linux课题实践四——ELF文件格式分析
			
2.4 ELF文件格式分析 20135318 刘浩晨 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目 ...
 - Quartz.NET 入门,带C#实例
			
概述 Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了 ...
 - PAT 1041 考试座位号
			
https://pintia.cn/problem-sets/994805260223102976/problems/994805281567916032 每个PAT考生在参加考试时都会被分配两个座位 ...
 - 自己写的browse.bat与perl写的url_handler.pl的比较
			
以前自己也写过Windows下自动打开多个浏览器测试某个URI,提高浏览器兼容性测试效率. 但是写的browse.bat文件还是最基础简陋的 @echo off if '%1'=='-c' ( sta ...
 - 普通PC安装ESXi5.5以及以上的方法
			
原贴内容 With ESXi 5, ESX no longer uses MBR for boot, it has gone to GPT-based partitions instead. W ...