Drivers Dissatisfaction 最小生成树+LCA
题意:给一张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的更多相关文章
- CF733F Drivers Dissatisfaction【链剖】【最小生成树应用】
F. Drivers Dissatisfaction time limit per test 4 seconds memory limit per test 256 megabytes input s ...
- Drivers Dissatisfaction
Drivers Dissatisfaction time limit per test 4 seconds memory limit per test 256 megabytes input stan ...
- Codeforces Round #378 (Div. 2) F - Drivers Dissatisfaction
F - Drivers Dissatisfaction 题目大意:给你n个点,m条边,每个边都有一个权重w,每条边也有一个c表示,消耗c元可以把这条边的权重减1,求最多消耗s元的最小生成树. 思路:因 ...
- 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 ...
- 【codeforces 733F】 Drivers Dissatisfaction
http://codeforces.com/problemset/problem/733/F (题目链接) 题意 给出一张n个点的无向图,每一条变有两个特征值:${w,c}$:分别表示这条边的权值为$ ...
- bzoj3732: Network--kruskal最小生成树+LCA
这是一道写起来比较顺手的题目 没有各种奇怪的细节,基本就是Kruskal和倍增LCA的模板.. 题目大意:对于一个无向带权图,询问两点之间一条路,使得这条路上的最长边最小,输出最小最长边的的值 那么既 ...
- Codeforces 733F Drivers Dissatisfaction
题意:有n个点,m条边,每条边有不满意度w[i],以及减小一个不满意度代价c[i],问给你s元用来减少代价,找到一个总不满意度最小的生成树,保证有解.(减少后的不满意度可以为负数)思路:显然所有的钱都 ...
- 【最小生成树+LCA】Imperial roads
http://codeforces.com/gym/101889 I 先跑一遍最小生成树,把经过的边和答案记录下来 对于每个询问的边,显然如果处于MST中,答案不变 如果不在MST中,假设这条边连上了 ...
- Codeforces Round #378 (Div. 2)F - Drivers Dissatisfaction GNU
http://codeforces.com/contest/733/problem/F 题意:给你一些城市和一些路,每条路有不满意程度和每减少一点不满意程度的花费,给出最大花费,要求找出花费小于s的最 ...
随机推荐
- 高可用Kubernetes集群-9. 部署kubelet
十一.部署kubelet 接下来两个章节是部署Kube-Node相关的服务,包含:kubelet,kube-proxy. 1. TLS bootstrap用户授权 # kubelet采用TLS Boo ...
- Numpy入门笔记第二天
# 数组的组合 import numpy as np arr1 = np.arange(5) arr2 = np.arange(3) print arr1 print arr2 [0 1 2 3 4] ...
- C语言—栈
栈的操作:进栈和出栈 #include "stdafx.h" #include "stack.h" #define maxsize 20 typedef int ...
- Amazon及其亏本诱饵策略还能坚持多久?
Amazon 刚刚公布了最新的财报,亏损 4100 万美元.这是这家电子商务巨头连续 5 个季度以来的第 3 次亏损.但是华尔街似乎却一片叫好声,当日 Amazon 的股价也涨了近 8 个点达 359 ...
- mysql innodb myisam 比较
InnoDB: 支持事务处理等 不加锁读取 支持外键 支持行锁 不支持FULLTEXT类型的索引 不保存表的具体行数,扫描表来计算有多少行 DELETE 表时,是一行一行的删除 InnoDB 把数据和 ...
- ES6的新特性(12)——Set 和 Map 数据结构
Set 和 Map 数据结构 Set 基本用法 ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. co ...
- 关于css文字的扩展
1.不换行: .title{ white-space:nowrap; text-overflow:ellipsis; } 2.超出变三点 .title{ white-space:nowrap; tex ...
- Scrum立会报告+燃尽图(Beta阶段第三次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2385 项目地址:https://coding.net/u/wuyy694 ...
- DCOM初步窥探二
1.COM进程透明性表现在“组件对象和客户程序可以拥有各自的空间,也可以共享同一个进程空间”. COM负责把客户的调用正确传到组件对象中,并保证参数传递的正确性. 组件对象和客户代码不必考虑调用传递的 ...
- mybatis_mysql
SELECT round(avg(c.AVG_DELAY_TIME)) as AVG_DELAY FROM `result_road_saturation_day` a LEFT JOIN info_ ...