【牛客 - 370F】Rinne Loves Edges(树,统计dp)

题干:

Rinne  最近了解了如何快速维护可支持插入边删除边的图,并且高效的回答一下奇妙的询问。

她现在拿到了一个 n 个节点 m 条边的无向连通图,每条边有一个边权 wiwi

现在她想玩一个游戏:选取一个 “重要点” S,然后选择性删除一些边,使得原图中所有除 S 之外度为 1 的点都不能到达 S。

定义删除一条边的代价为这条边的边权,现在 Rinne 想知道完成这个游戏的最小的代价,这样她就能轻松到达 rk1 了!作为回报,她会让你的排名上升一定的数量。

 

输入描述:

第一行三个整数 N,M,S,意义如「题目描述」所述。接下来 M 行,每行三个整数 u,v,w 代表点 u 到点 v 之间有一条长度为 w 的无向边。

输出描述:

一个整数表示答案。

示例1

输入

复制

4 3 1 
1 2 1 
1 3 1 
1 4 1

输出

复制

3

说明

需要使得点 2,3,4 不能到达点 1,显然只能删除所有的边,答案为 3

示例2

输入

复制

4 3 1 
1 2 3 
2 3 1 
3 4 2

输出

复制

1

说明

需要使得点 4 不能到达点 1,显然删除边 2↔32↔3是最优的。

备注:

2≤S≤N≤105,M=N−12≤S≤N≤105,M=N−1,保证答案在 C++ long long 范围内。

解题报告:

   不算难的树形dp,刚开始读题错了,所以代码不太对、、

于是题目转变求为了一棵根为 S 的树,选择性切掉一些边,使得所有的叶子都不能到达根的最小代价。
让我们考虑树形dp(其实可能就是个统计算不上dp):设 fv 表示使得以 v 为根的子树内的叶子到不了 v 的最小代价,转移显然枚举每一条边切不切就可以了。
方程大概是这样:设当前我们要更新的点是 u,u 的一个儿子是 v,他们之间的边的边权是 w。则有转移方程 fu+=min{fv,w}。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<ctime>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
int t;
int n,m,s,tot;
int head[MAX];
int in[MAX];
struct Edge{int u,v,ne;ll w;
} e[MAX];
void add(int u,int v,ll w) {e[++tot].u = u;e[tot].v = v;e[tot].w = w;e[tot].ne = head[u];head[u] = tot;
}
ll dfs(int cur,int root,ll val) {//ll res = 9223372036854775807;ll tmp = 0;for(int i = head[cur]; i!=-1; i=e[i].ne) {if(e[i].v == root) continue;//res = min(res,e[i].w);if(in[e[i].v] == 1) {tmp += e[i].w;continue;}
//		if(in[e[i].v] == 1) continue;tmp += dfs(e[i].v,cur,e[i].w);}return min(tmp,val);
}
int main() 
{cin>>n>>m>>s;memset(head,-1,sizeof head);int a,b;ll c;for(int i = 1; i<=m; i++) {scanf("%d%d%lld",&a,&b,&c);add(a,b,c);add(b,a,c);in[a]++,in[b]++;}ll ans = 0;for(int i = head[s]; i != -1; i = e[i].ne) {if(in[e[i].v] == 1) ans += e[i].w;else ans += dfs(e[i].v,s,e[i].w); } printf("%lld\n",ans);return 0 ;
}

错误代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<ctime>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
int t;
int n,m,s,tot;
int head[MAX];
int in[MAX];
struct Edge{int u,v,ne;ll w;
} e[MAX];
void add(int u,int v,ll w) {e[++tot].u = u;e[tot].v = v;e[tot].w = w;e[tot].ne = head[u];head[u] = tot;
}
ll dfs(int cur,int root) {ll res = 9223372036854775807;//int isye = 1;for(int i = head[cur]; i!=-1; i=e[i].ne) {if(e[i].v == root) continue;//isye = 0;res = min(res,e[i].w);if(in[e[i].v] == 1) {continue;}res = min(res,dfs(e[i].v,cur));}//if(isye == 1) returnreturn res;
}
int main()
{cin>>n>>m>>s;memset(head,-1,sizeof head);int a,b;ll c;for(int i = 1; i<=m; i++) {scanf("%d%d%lld",&a,&b,&c);add(a,b,c);add(b,a,c);in[a]++,in[b]++;}ll ans = 0;for(int i = head[s]; i != -1; i = e[i].ne) {if(in[e[i].v] == 1) ans += e[i].w;else ans += dfs(e[i].v,s);}printf("%lld\n",ans);return 0 ;
}

AC代码2:

#include<bits/stdc++.h>
using namespace std;
int n,m,s;
struct edge
{int to;int cost;
};
vector<edge> e[110005];
bool vis[100005];
int mem[100005];
long long dp(int i,int pre)
{if(e[i].size()==1&&i!=s){return e[i][0].cost;}if(mem[i]!=-1)return mem[i];vis[i]=1;long long res=0;int nxt;int co;edge tmp;for(int j=0;j<e[i].size();j++){tmp=e[i][j];nxt=tmp.to;if(vis[nxt])continue;co=tmp.cost;res+=dp(nxt,min(co,pre));}res=min(res,(long long)pre);mem[i]=res;return res;
}
int main()
{//freopen("in.txt","r",stdin);memset(mem,-1,sizeof(mem));scanf("%d%d%d",&n,&m,&s);int u,v,w;edge tmp;for(int i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&w);tmp.cost=w;tmp.to=v;e[u].push_back(tmp);tmp.to=u;e[v].push_back(tmp);}long long ans=dp(s,0x3f3f3f3f);cout<<ans<<endl;return 0;
}

官方标程:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <climits>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>#define Re register
#define LL long long
#define U unsigned
#define FOR(i,a,b) for(Re int i = a;i <= b;++i)
#define ROF(i,a,b) for(Re int i = a;i >= b;--i)
#define SFOR(i,a,b,c) for(Re int i = a;i <= b;i+=c)
#define SROF(i,a,b,c) for(Re int i = a;i >= b;i-=c)
#define CLR(i,a) memset(i,a,sizeof(i))
#define BR printf("--------------------\n")
#define DEBUG(x) std::cerr << #x << '=' << x << std::endlconst int MAXN = 100000+5;struct Edge{int to,w,next;
}e[MAXN<<1];
int head[MAXN],cnt;
LL f[MAXN];inline void add(int u,int v,int w){e[++cnt] = (Edge){v,w,head[u]};head[u] = cnt;
}void dfs(int v,int fa=0){bool flag = true;for(int i = head[v];i;i = e[i].next){if(e[i].to == fa) continue;flag = false;dfs(e[i].to,v);f[v] += std::min(1ll*e[i].w,f[e[i].to]);}if(flag) f[v] = INT_MAX;
}int N,root;int main(){scanf("%d%*d%d",&N,&root);FOR(i,1,N-1){int u,v,w;scanf("%d%d%d",&u,&v,&w);add(u,v,w);add(v,u,w);}dfs(root);printf("%lld\n",f[root]);return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 单例 饿汉式_Java-单例设计模式(懒汉与饿汉)

单例设计模式保证一个类在内存中只能有一个对象。思路&#xff1a;1)如果其他程序能够随意用 new 创建该类对象&#xff0c;那么就无法控制个数。因此&#xff0c;不让其他程序用 new 创建该类的对象。2)既然不让其他程序 new 该类对象&#xff0c;那么该类在自己内部就要创建一…

【HYSBZ - 2763 】飞行路线 (分层图最短路,最短路dp)

题干&#xff1a; Alice和Bob现在要乘飞机旅行&#xff0c;他们选择了一家相对便宜的航空公司。该航空公司一共在n个城市设有业务&#xff0c;设这些城市分别标记为0到n-1&#xff0c;一共有m种航线&#xff0c;每种航线连接两个城市&#xff0c;并且航线有一定的价格。Alice和…

java 命令行 编译 jar文件_用命令行编译java并生成可执行的jar包

如果想用java编写一个可视化小程序&#xff0c;碰巧手头没有IDE的话&#xff0c;可以用命令行来完成编译、打包等工作。拿自己编写的“java记事本”为例&#xff0c;介绍一下这个过程&#xff1a;1.编写源代码。编写源文件&#xff1a;NotePad.java并保存&#xff0c;例如&…

【牛客 - 369A】小D的剧场(线性dp)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/369/A 来源&#xff1a;牛客网 题目描述 "我明白。" 作为这命运剧场永远的观众&#xff0c;小D一直注视着这片星光璀璨的舞台&#xff0c;舞台上&#xff0c;少女们的身姿演绎出了一幕幕…

java list遍历添加元素_java遍历List过程中添加和删除元素的问题

遍历元素最常见的三种方法&#xff1a;//第三种遍历【利用迭代器】private static void loopList3(List strList) {Iterator itr strList.iterator();while (itr.hasNext()){String tmp itr.next();if("000".equals(tmp)){itr.remove();}else{System.out.println(t…

【蓝桥杯官网试题 - 算法提高 】求最大值 (dp,0-1背包)

题干&#xff1a; 问题描述 给n个有序整数对ai bi&#xff0c;你需要选择一些整数对 使得所有你选定的数的aibi的和最大。并且要求你选定的数对的ai之和非负&#xff0c;bi之和非负。 输入格式 输入的第一行为n&#xff0c;数对的个数   以下n行每行两个整数 ai bi 输出格…

java button 圆角_UIButton具有渐变边框和圆角

我想要的是一个自定义UIButton&#xff0c;它有一个渐变边框(只是边框是渐变)和圆角 . 我几乎到了我想去的地方&#xff0c;但是角落有问题 . 这是我目前拥有的&#xff1a;这是我的代码&#xff1a;override func viewDidLoad() {super.viewDidLoad()let gradient CAGradient…

【牛客 - 368B】选点(dfs序,LIS 或 dfs序 + 树状数组 + 离散化,树状数组求LIS的方法)

题干&#xff1a; 有一棵n个节点的二叉树&#xff0c;1为根节点&#xff0c;每个节点有一个值wi。现在要选出尽量多的点。 对于任意一棵子树&#xff0c;都要满足&#xff1a; 如果选了根节点的话&#xff0c;在这棵子树内选的其他的点都要比根节点的值大&#xff1b; 如…

java xsd 解析 xml文件_Java针对XSD文件验证XML文件的最佳方法是什么?

小编典典Java运行时库支持验证。上次我检查的是幕后的Apache Xerces解析器。你可能应该使用javax.xml.validation.Validator。import javax.xml.XMLConstants;import javax.xml.transform.Source;import javax.xml.transform.stream.StreamSource;import javax.xml.validation.…

*【CodeForces - 859C 】Pie Rules (博弈dp,时光倒流)

题干&#xff1a; You may have heard of the pie rule before. It states that if two people wish to fairly share a slice of pie, one person should cut the slice in half, and the other person should choose who gets which slice. Alice and Bob have many slices …

【牛客 - 318F】关于我转生变成史莱姆这档事(二分,搜索)

题干&#xff1a; 有一天&#xff0c;利姆鲁在这个世界最重要的人静被魔王带走&#xff0c;并将其困在一个n*n的迷宫内的某一处&#xff0c;迷宫的每个格子都可能有一只魔物&#xff0c;魔物的攻击力为a[i][j]&#xff0c;因而利姆鲁只有当攻击力大于等于a[i][j]才能通过这个方…

java获取xlsx某列数据_Java读取Excel指定列的数据详细教程和注意事项

本文使用jxl.jar工具类库实现读取Excel中指定列的数据。jxl.jar是通过java操作excel表格的工具类库&#xff0c;是由java语言开发而成的。这套API是纯Java的&#xff0c;并不依赖Windows系统&#xff0c;即使运行在Linux下&#xff0c;它同样能够正确的处理Excel文件。支持Exce…

【CodeForces - 988C 】Equal Sums (思维,STLmap,STLset,tricks)

题干&#xff1a; You are given kk sequences of integers. The length of the ii-th sequence equals to nini. You have to choose exactly two sequences ii and jj (i≠ji≠j) such that you can remove exactly one element in each of them in such a way that the su…

java quartz 数据库_SpringBoot+Quartz+数据库存储

Spring整合Quartza、quartz调度框架是有内置表的进入quartz的官网http://www.quartz-scheduler.org/&#xff0c;点击Downloads&#xff0c;下载后在目录\docs\dbTables下有常用数据库创建quartz表的脚本&#xff0c;例如&#xff1a;“tables_mysql.sql”table_mysql.sqltable…

【CodeForces - 1062C】Banh-mi (贪心,数学,找规律,快速幂)

题干&#xff1a; JATC loves Banh-mi (a Vietnamese food). His affection for Banh-mi is so much that he always has it for breakfast. This morning, as usual, he buys a Banh-mi and decides to enjoy it in a special way. First, he splits the Banh-mi into nn pa…

【牛客 - 练习】约数个数的和(数论,数学)

题干&#xff1a; 给个n&#xff0c;求1到n的所有数的约数个数的和~ 输入描述: 第一行一个正整数n 输出描述: 输出一个整数&#xff0c;表示答案 示例1 输入 复制 3 输出 复制 5 说明 样例解释&#xff1a; 1有1个约数1 2有2个约数1,2 3有2个约数1,3 备注: n…

mysql json 创建索引_MySQL · 最佳实践 · 如何索引JSON字段

概述MySQL从5.7.8起开始支持JSON字段&#xff0c;这极大的丰富了MySQL的数据类型。也方便了广大开发人员。但MySQL并没有提供对JSON对象中的字段进行索引的功能&#xff0c;至少没有直接对其字段进行索引的方法。本文将介绍利用MySQL 5.7中的虚拟字段的功能来对JSON对象中的字段…

mysql链路跟踪工具_EasySwoole利用链路追踪组件制作甩锅工具

前言最近前端老是反馈API调用异常&#xff0c;说请求成功但是没有数据返回&#xff01;我写的代码怎么可能有bug&#xff0c;肯定是前端调用的方式不对&#xff01;经过一番套鼓&#xff0c;直接把请求参数和响应内容打印到控制台&#xff0c;果然不出我所料&#xff0c;请求缺…

【CCFCSP- 201312-4】有趣的数(线性dp)

题干&#xff1a; 试题编号&#xff1a;201312-4试题名称&#xff1a;有趣的数时间限制&#xff1a;1.0s内存限制&#xff1a;256.0MB问题描述&#xff1a; 问题描述   我们把一个数称为有趣的&#xff0c;当且仅当&#xff1a;   1. 它的数字只包含0, 1, 2, 3&#xff0c…

java selector 源码_Java NIO核心组件-Selector和Channel

昨天我们介绍了一下SelectorProvider和IO multiplexing.特别是IO multiplexing中的epoll系统调用,是Linux版本的Java的NIO的核心实现.那今天我们就来介绍一下, Java NIO中的核心组件, Selector和Channel.这两个组件,对于熟悉Java OIO,而不熟悉Java NIO的朋友来说,理解其作用是极…