达到

这题乍一看是一个图论 我不会啊啊啊 但看到m=n-1 发现这是一颗树 要度为一 百度一下发现树上度为一的节点那就只有叶节点了 于是这变成了一个树上dp(因为是求最优解)
如何不能到达 那就是切直接连的边或者子节点的边 求最小就判断一下谁更小就切谁
于是这个题就出来了 代码有详细注释QAQ 使用链式前向星存图

#include <bits/stdc++.h>
#define ll long long
using namespace std;
#define inf 1e18
ll const maxn=2e5+10;
struct M{///链式前向星存图
    ll to,next,val;///终点,同起点的上一条边的编号,边权
}edge[maxn];///边集
ll n,m,s,u,v,w,cnt,head[maxn],f[maxn],du[maxn];
void add(ll u,ll v,ll w)
{
  edge[++cnt].next = head[u];///以u为起点上一条边的编号,也就是与这个边起点相同的上一条边的编号
  edge[cnt].to=v;///终点
  edge[cnt].val=w;///权值
  head[u]=cnt;///更新以u为起点上一条边的编号
}
void dfs(ll u,ll fa) {
  if (du[u]==1&&u!=s)///为叶子节点
  {
    f[u]=inf;///初始化为最大
    return;
  }
  for (ll i=head[u];i!=0;i=edge[i].next)///遍历以i为起点的边
  {
    if (edge[i].to!=fa) ///fa为0 判断是否到底了
    {
      dfs(edge[i].to,u);
      f[u]+=min(f[edge[i].to], edge[i].val);///看是直接连的边小 还是子节点的边小
                                            ///一步步回推形成最小解
    }
  }
}
int main() {
  scanf("%d%d%d",&n,&m,&s);
  for(ll i=1;i<=n-1;++i)
  {
    scanf("%d%d%d",&u,&v,&w);///u,v节点 w权值
    add(u,v,w);
    add(v,u,w);
    du[u]++,du[v]++;///度为一 那就只有一条边相连 就是叶节点
  }
  dfs(s,0);///以s为根节点
  cout<<f[s]<<endl;
  return 0;
}





这题乍一看是一个图论 我不会啊啊啊 但看到m=n-1 发现这是一颗树 要度为一 百度一下发现树上度为啊
一的节点那就只有叶节点了 于是这变成了一个树上dp(因为是求最优解)
如何不能到达 那就是切直接连的边或者子节点的边 求最小就判断一下谁更小就切谁
于是这个题就出来了 代码有详细注释QAQ 使用链式前向星存图

#include <bits/stdc++.h>
#define ll long long
using namespace std;
#define inf 1e18
ll const maxn=2e5+10;
struct M{///链式前向星存图
    ll to,next,val;///终点,同起点的上一条边的编号,边权
}edge[maxn];///边集
ll n,m,s,u,v,w,cnt,head[maxn],f[maxn],du[maxn];
void add(ll u,ll v,ll w)
{
  edge[++cnt].next = head[u];///以u为起点上一条边的编号,也就是与这个边起点相同的上一条边的编号
  edge[cnt].to=v;///终点
  edge[cnt].val=w;///权值
  head[u]=cnt;///更新以u为起点上一条边的编号
}
void dfs(ll u,ll fa) {
  if (du[u]==1&&u!=s)///为叶子节点
  {
    f[u]=inf;///初始化为最大
    return;
  }
  for (ll i=head[u];i!=0;i=edge[i].next)///遍历以i为起点的边
  {
    if (edge[i].to!=fa) ///fa为0 判断是否到底了
    {
      dfs(edge[i].to,u);
      f[u]+=min(f[edge[i].to], edge[i].val);///看是直接连的边小 还是子节点的边小
                                            ///一步步回推形成最小解
    }
  }
}
int main() {
  scanf("%d%d%d",&n,&m,&s);
  for(ll i=1;i<=n-1;++i)
  {
    scanf("%d%d%d",&u,&v,&w);///u,v节点 w权值
    add(u,v,w);
    add(v,u,w);
    du[u]++,du[v]++;///度为一 那就只有一条边相连 就是叶节点
  }
  dfs(s,0);///以s为根节点
  cout<<f[s]<<endl;
  return 0;
}



是但是达到
多个
就导出
就sd看但是
d d的


刈是

全部评论

相关推荐

头像
今天 11:23
已编辑
北京邮电大学 管理咨询
211勇闯初创小公司头破血流系列3这件事不是发生在我身上的,但前同事们参与创作的积极性空前高涨,为了习惯,还是都采用第一人称的视角来看这出大戏。有一天老板在我们的眼皮底下接了一个电话,最终敲定了去北京出差的时间,下周一。他得意洋洋地说,这单下来保底五百万的流水,如果成了,我们都能得到五位数的提成。这对于一群刚上班的人来说是天大的诱惑,我们经历了周末的无偿加班,把他去北京所需要的文件都准备好了。只是在去北京的周一当天,老板睡过头了。整个上午都没见他的踪影,给他发文件也不会,打电话问问题也不接,直到中午才姗姗来迟。当然,这只是拉开了这场恐怖出差的序幕。只见他来了也不紧不慢的,手指在办公室转了一圈,...
姜大力:补充: 1.五百万的单子根本没有五百万,只是过去展示拼装的产品并简单考察。该项目只是竞标,项目内容是商业街区改造; 2.决策是当天上午10点半左右老板珊珊来迟后突发奇想去北京,中午1点在催促下着急出发,没有任何出差补助; 3.出发之前已经知道进京证不好使了,但还是执意要开车去; 4.实习生实打实连续开了***小事车,非常辛苦,工资在转正后只有两千五; (有疑问会继续补充)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务