传送门

不难发现,对于每一条树边肯定要减小它的权值,对于每一条非树边要增加它的权值

对于每一条非树边\(j\),他肯定与某些树边构成了一个环,那么它的边权必须大于等于这个环上的所有边

设其中一条边为\(i\),变化量为\(x\),那么就要满足\(w_i-x_i\leq w_j+x_j\),即\(x_i+x_j\geq w_i-w_j\)

然后它就是一个线性规划了,长这个样子

\[Min\sum_i x_i+\sum_jx_j
\]

\[x_i+x_j\geq w_i-w_j
\]

\[x_i\geq 0
\]

然后因为这玩意儿是求目标函数的最小值,所以我们得把它对偶之后变成求它的最大值,然后它长成了这个样子(令\(y_k\)为第\(k\)个约束条件对偶后的变量,\(d_{k,i}\)表示第\(k\)个约束中是否有\(x_i\)这个变量)

\[Max\sum (w_i-w_j)y_k
\]

\[\sum_k y_kx_{ki}\leq 1
\]

\[y_i\geq 0
\]

然后直接上单纯形

因为一些精度原因,如果最后的答案在\(-eps\)到\(eps\)之间手动输出\(0\)否则它的答案会是个负数……

//minamoto
#include<bits/stdc++.h>
#define R register
#define Loli true
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=1005,M=10005;const double eps=1e-8,inf=1e18;
struct eg{int v,nx,id;}e[N<<1];int head[N],tot;
inline void add(R int u,R int v,R int id){e[++tot]={v,head[u],id},head[u]=tot;}
int n,m,nn,mm,u,v,x,dep[N],fa[N],id[N],U[N],V[N],W[N],F[N],G[N][N];
double a[N][M];
void dfs(int u){go(u)if(v!=fa[u])fa[v]=u,id[v]=e[i].id,dep[v]=dep[u]+1,dfs(v);}
void pivot(int l,int e){
double t=a[l][e];a[l][e]=1;fp(i,0,m)a[l][i]/=t;
fp(i,0,n)if(i!=l&&fabs(a[i][e])>eps){
t=a[i][e],a[i][e]=0;
fp(j,0,m)a[i][j]-=t*a[l][j];
}
}
void simplex(){
while(Loli){
int l=0,e=0;double mn=inf;
fp(i,1,m)if(a[0][i]>eps){e=i;break;}if(!e)return;
fp(i,1,n)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(){
// freopen("testdata.in","r",stdin);
nn=read(),mm=read();
fp(i,1,mm)U[i]=read(),V[i]=read(),W[i]=read(),G[U[i]][V[i]]=G[V[i]][U[i]]=i;
fp(i,1,nn-1)u=read(),v=read(),x=G[u][v],add(U[x],V[x],x),add(V[x],U[x],x);
dfs(1),n=mm;
fp(i,1,mm)if(F[i])a[i][0]=1;
else{
a[i][0]=1,u=U[i],v=V[i];
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];
}
}simplex();if(a[0][0]<eps&&a[0][0]>-eps)puts("0");
else printf("%.0lf\n",-a[0][0]);return 0;
}

P4412 [SHOI2004]最小生成树的更多相关文章

  1. [BZOJ1937][SHOI2004]Mst最小生成树(KM算法,最大费用流)

    1937: [Shoi2004]Mst 最小生成树 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 802  Solved: 344[Submit][Sta ...

  2. 【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)

    [BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的 ...

  3. BZOJ 1937: [Shoi2004]Mst 最小生成树 [二分图最大权匹配]

    传送门 题意: 给一张无向图和一棵生成树,改变一些边的权值使生成树为最小生成树,代价为改变权值和的绝对值,求最小代价 线性规划的形式: $Min\quad \sum\limits_{i=1}^{m} ...

  4. 【bzoj1937】 Shoi2004—Mst 最小生成树

    http://www.lydsy.com/JudgeOnline/problem.php?id=1937 (题目链接) 题意 一个无向图,给出一个生成树,可以修改每条边的权值,问最小修改多少权值使得给 ...

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

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

  6. BZOJ1937 [Shoi2004]Mst 最小生成树

    首先由贪心的想法知道,树边只减不加,非树边只加不减,令$w_i$表示i号边原来的边权,$d_i$表示i号边的改变量 对于一条非树边$j$连接着两个点$x$.$y$,则对于$xy$这条路径上的所有树边$ ...

  7. [BZOJ 1937][Shoi2004]Mst 最小生成树

    传送门 $ \color{red} {solution:} $ 对于每条树边\(i\),其边权只可能变小,对于非树边\(j\),其边权只可能变大,所以对于任意非树边覆盖的树边有 \(wi - di & ...

  8. 最小生成树(Kruskal算法-边集数组)

    以此图为例: package com.datastruct; import java.util.Scanner; public class TestKruskal { private static c ...

  9. 最小生成树计数 bzoj 1016

    最小生成树计数 (1s 128M) award [问题描述] 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一 ...

随机推荐

  1. Codeforces 559A(计算几何)

    A. Gerald's Hexagon time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. Help him--hdu5059(模拟 大坑)

    http://acm.hdu.edu.cn/showproblem.php?pid=5059 直接说可能出现的情况 #include <iostream> #include <cst ...

  3. poj——3118 Arbiter

      Arbiter 题目描述:      “仲裁者”是<星际争霸>科幻系列中的一种太空船.仲裁者级太空船是神族的战船,专门提供精神力支援.不像其他战船的人员主要是战士阶级,仲裁者所承载的都 ...

  4. weblogic线程阻塞性能调优(图解)

    转自:http://blog.csdn.net/z69183787/article/details/12647539 声明:出现这个问题有程序方面.网络方面.weblogic设置方面等等原因,此文章主 ...

  5. Oracle 用户表空间查看、修改大小、设置自增长等

      分类: Oracle 首先登入某个用户,查看某个用户在哪个表空间下: select username,default_tablespace from user_users; 查看该用户下所有的表: ...

  6. 查看linux接口进出口流量的命令;linux 网络监控;流量监控

    1.nload,左右键切换网卡 2.sudo iftop 3.sudo iptraf 按连接/端口查看流量 4.sudo nethogs: 按进程查看流量占用 5.ss: 连接查看工具 6.dstat ...

  7. HDOJ 5416 CRB and Tree DFS

    CRB and Tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

  8. [Bash] Find Files and Folders with `find` in Bash

    find is a powerful tool that can not only find files but it can run a command on each matching file ...

  9. sdut 面向对象程序设计上机练习四(变量引用)

    面向对象程序设计上机练习四(变量引用) Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 将变量的引用作为函数形參,实现2个int型数据交换. 输入 输入2 ...

  10. C++对象模型——解构语意学(第五章)

    5.4    对象的效率 (Object Efficiency) 在下面的效率測试中,对象构造和拷贝所须要的成本是以Point3d class声明为基准,从简单形式逐渐到复杂形式,包含Plain Ol ...