题意:给一张n个点m条边的连通图,每条边(ai,bi)有一个权值wi和费用ci,

表示这条边每降低1的权值需要ci的花费。现在一共有S费用可以用来降低某些边的权值

(可以降到负数),求图中的一棵权值和最小的生成树并输出方案

显然是找到一条边然后将这条边减到最小

先跑一边最小生成树,找到树上最小的一点,然后在枚举其他的边,

加上这条边会产生一个环,所以需要删除这个环上面权值最大的边

这个通过类似于LCA倍增的手法做到,

 #include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <set>
#include <iostream>
#include <map>
#include <stack>
#include <string>
#include <vector>
#define pi acos(-1.0)
#define eps 1e-6
#define fi first
#define se second
#define rtl rt<<1
#define rtr rt<<1|1
#define bug printf("******\n")
#define mem(a,b) memset(a,b,sizeof(a))
#define name2str(x) #x
#define fuck(x) cout<<#x" = "<<x<<endl
#define f(a) a*a
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
#define pf printf
#define FRE(i,a,b) for(i = a; i <= b; i++)
#define FREE(i,a,b) for(i = a; i >= b; i--)
#define FRL(i,a,b) for(i = a; i < b; i++)+
#define FRLL(i,a,b) for(i = a; i > b; i--)
#define FIN freopen("data.txt","r",stdin)
#define gcd(a,b) __gcd(a,b)
#define lowbit(x) x&-x
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int mod = 1e9 + ;
const int maxn = 2e5 + ;
const int INF = 0x3f3f3f3f;
const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;
int n, m, c[maxn], w[maxn], fa[maxn], vis[maxn];
int dep[maxn], p[maxn][], maxx[maxn][];
struct Edge {
int u, v, w, id;
} edge[maxn];
int cmp ( Edge a, Edge b ) {
return a.w < b.w;
}
struct xxx {
int v, id;
xxx ( int v, int id ) : v ( v ), id ( id ) {}
};
vector<xxx>mp[maxn];
int Find ( int x ) {
return fa[x] == x ? x : fa[x] = Find ( fa[x] );
}
void dfs ( int u, int f, int id ) {
dep[u] = dep[f] + , p[u][] = f, maxx[u][] = id;
for ( int i = ; i <= ; i++ ) {
if ( dep[u] - ( << i ) <= ) break;
int v = p[u][i - ];
p[u][i] = p[v][i - ];
if ( w[maxx[u][i - ]] < w[maxx[v][i - ]] ) maxx[u][i] = maxx[v][i - ];
else maxx[u][i] = maxx[u][i - ];
}
for ( int i = ; i < mp[u].size() ; i++ ) {
int v = mp[u][i].v, id = mp[u][i].id;
if ( v != f ) dfs ( v, u, id );
}
}
int get_max ( int x, int y ) {
if ( dep[x] < dep[y] ) swap ( x, y );
int temp = , ans = ;
for ( int i = ; i >= ; i-- ) {
if ( dep[x] - ( << i ) >= dep[y] ) {
if ( w[maxx[x][i]] > temp ) ans = maxx[x][i], temp = w[ans];
x = p[x][i];
}
}
if ( x == y ) return ans;
for ( int i = ; i >= ; i-- ) {
if ( dep[x] - ( << i ) > && p[x][i] != p[y][i] ) {
if ( w[maxx[x][i]] > temp ) ans = maxx[x][i], temp = w[ans];
if ( w[maxx[y][i]] > temp ) ans = maxx[y][i], temp = w[ans];
x = p[x][i], y = p[y][i];
if ( x == y ) break;
}
}
if ( w[maxx[x][]] > temp ) ans = maxx[x][], temp = w[ans];
if ( w[maxx[y][]] > temp ) ans = maxx[y][], temp = w[ans];
return ans;
}
int main() {
sff ( n, m );
for ( int i = ; i <= m ; i++ ) sf ( w[i] );
for ( int i = ; i <= m ; i++ ) sf ( c[i] );
for ( int i = ; i <= m ; i++ ) {
sff ( edge[i].u, edge[i].v );
edge[i].w = w[i], edge[i].id = i;
}
sort ( edge + , edge + + m, cmp );
LL sum = , s, minn = INF, idx = , k = ;
scanf ( "%lld", &s );
for ( int i = ; i <= n ; i++ ) fa[i] = i;
for ( int i = ; i <= m ; i++ ) {
int nx = Find ( edge[i].v ), ny = Find ( edge[i].u );
if ( nx == ny ) continue;
fa[nx] = ny;
sum += edge[i].w;
vis[edge[i].id] = , k++;
if ( c[edge[i].id] < minn ) idx = edge[i].id, minn = c[edge[i].id];
mp[edge[i].u].push_back ( xxx ( edge[i].v, edge[i].id ) );
mp[edge[i].v].push_back ( xxx ( edge[i].u, edge[i].id ) );
if ( k == n - ) break;
}
LL ans = sum - s / minn;
dep[] = ;
dfs ( , , );
int del = ;
for ( int i = ; i <= m ; i++ ) {
if ( vis[edge[i].id] ) continue;
int cnt = get_max ( edge[i].u, edge[i].v );
if ( cnt == ) continue;
LL temp = sum - w[cnt] + w[edge[i].id] - s / c[edge[i].id];
if ( temp < ans ) ans = temp, idx = edge[i].id, del = cnt;
}
if ( del ) vis[del] = , vis[idx] = ;
printf ( "%lld\n", ans );
w[idx] -= s / c[idx];
for ( int i = ; i <= m ; i++ ) if ( vis[i] ) printf ( "%d %d\n", i, w[i] );
return ;
}

Drivers Dissatisfaction 最小生成树+LCA的更多相关文章

  1. CF733F Drivers Dissatisfaction【链剖】【最小生成树应用】

    F. Drivers Dissatisfaction time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  2. Drivers Dissatisfaction

    Drivers Dissatisfaction time limit per test 4 seconds memory limit per test 256 megabytes input stan ...

  3. Codeforces Round #378 (Div. 2) F - Drivers Dissatisfaction

    F - Drivers Dissatisfaction 题目大意:给你n个点,m条边,每个边都有一个权重w,每条边也有一个c表示,消耗c元可以把这条边的权重减1,求最多消耗s元的最小生成树. 思路:因 ...

  4. codeforce 378 div 2 F —— Drivers Dissatisfaction (最小生成树,LCA,倍增)

    官方题解: If you choose any n - 1 roads then price of reducing overall dissatisfaction is equal to min(c ...

  5. 【codeforces 733F】 Drivers Dissatisfaction

    http://codeforces.com/problemset/problem/733/F (题目链接) 题意 给出一张n个点的无向图,每一条变有两个特征值:${w,c}$:分别表示这条边的权值为$ ...

  6. bzoj3732: Network--kruskal最小生成树+LCA

    这是一道写起来比较顺手的题目 没有各种奇怪的细节,基本就是Kruskal和倍增LCA的模板.. 题目大意:对于一个无向带权图,询问两点之间一条路,使得这条路上的最长边最小,输出最小最长边的的值 那么既 ...

  7. Codeforces 733F Drivers Dissatisfaction

    题意:有n个点,m条边,每条边有不满意度w[i],以及减小一个不满意度代价c[i],问给你s元用来减少代价,找到一个总不满意度最小的生成树,保证有解.(减少后的不满意度可以为负数)思路:显然所有的钱都 ...

  8. 【最小生成树+LCA】Imperial roads

    http://codeforces.com/gym/101889 I 先跑一遍最小生成树,把经过的边和答案记录下来 对于每个询问的边,显然如果处于MST中,答案不变 如果不在MST中,假设这条边连上了 ...

  9. Codeforces Round #378 (Div. 2)F - Drivers Dissatisfaction GNU

    http://codeforces.com/contest/733/problem/F 题意:给你一些城市和一些路,每条路有不满意程度和每减少一点不满意程度的花费,给出最大花费,要求找出花费小于s的最 ...

随机推荐

  1. 关于购买Redis服务器:腾讯云、阿里云还是华为云?

    个人分类: redis使用 编辑 新年伊始,很多商家都开始进行新年产品大促销,在分布是缓存Redis领域,几家大公司也是打得如火如荼,各有千秋啊. 现在市场上比较有口碑的商家有腾讯云.阿里云.华为云三 ...

  2. python—退出ipython3的help()

    退出ipython3的help() 组合键:ctrl+z

  3. Fluent Python: memoryview

    关于Python的memoryview内置类,搜索国内网站相关博客后发现对其解释都很简单, 我觉得学习一个新的知识点一般都要弄清楚两点: 1, 什么时候使用?(也就是能解决什么问题) 2,如何使用? ...

  4. Oracle数据库拼音首字母模糊搜索

    1.建立函数 CREATE OR REPLACE FUNCTION F_PINYIN(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS V_COMPARE ); V_RET ...

  5. Java Web文件上传原理分析(不借助开源fileupload上传jar包)

    Java Web文件上传原理分析(不借助开源fileupload上传jar包) 博客分类: Java Web   最近在面试IBM时,面试官突然问到:如果让你自己实现一个文件上传,你的代码要如何写,不 ...

  6. ERROR----java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils

    2013-4-28 13:17:57 org.apache.catalina.core.StandardContext filterStart 严重: Exception starting filte ...

  7. OpenLayers 3 入门教程

    OpenLayers 3 入门教程摘要OpenLayers 3对OpenLayers网络地图库进行了根本的重新设计.版本2虽然被广泛使用,但从JavaScript开发的早期发展阶段开始,已日益现实出它 ...

  8. bash编程2

    bash基础编程 前言:条件测试语法有两种书写模式,一种时[expression] ,另外一种是[[exprssion]] ,为了在书写条件测试的过程中,不让大家将两种格式互相混淆,那么在这里只讲一种 ...

  9. huawei oceanstor

      华为产品:OceanStor 6000 V3系列 OceanStor 6800 V3 网页登入设备页面:https+ip+端口 资源分配界面: 首页: wwn为2100xxxxxxxx47e4,设 ...

  10. 对Excle的行和列进行检查 单元格类型转换代码 ;

    对Excle的行和列进行检查  转换代码 : ** * 导入信息 */ @Override public List<Object> add(HttpServletRequest reque ...