1 条题解
-
0
自动搬运
来自洛谷,原作者为

bztMinamoto
**搬运于
2025-08-24 21:59:54,当前版本为作者最后更新于2018-12-11 20:27:01,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
不难发现,对于每一条树边肯定要减小它的权值,对于每一条非树边要增加它的权值
对于每一条非树边,他肯定与某些树边构成了一个环,那么它的边权必须大于等于这个环上的所有边
设其中一条边为,变化量为,那么就要满足,即
然后它就是一个线性规划了,长这个样子
然后因为这玩意儿是求目标函数的最小值,所以我们得把它对偶之后变成求它的最大值,然后它长成了这个样子(令为第个约束条件对偶后的变量,表示第个约束中是否有这个变量)
然后直接上单纯形
因为一些精度原因,如果最后的答案在到之间手动输出否则它的答案会是个负数……
//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; }
- 1
信息
- ID
- 3383
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者