POJ 3140 Contestants Division「建议收藏」

POJ 3140 Contestants Division

大家好,又见面了,我是全栈君。

题目大意:

给出一棵树。求去掉一条边之后两棵子树节点权值和作差的最小值。


解题思路:

这不知道怎么用树形DP做,仅仅是个DFS就过了。还手残了一次。

思路详细看代码。



以下是代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <vector>
#include <string>
#include <map>
#include <queue>
using namespace std;

int min(int a,int b)
{
    if(a>b)a=b;
    return a;
}
int max(int a,int b)
{
    if(a<b)a=b;
    return a;
}
struct node
{
    int to,next;
} edge[100005*2];
int n,m,cnt,head[100005];
long long weight[100005],min1,sum;
const long long inf = 100000000000000ll;
bool vis[100005];
void addedge(int u,int v)
{
    edge[cnt].to=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
    edge[cnt].to=u;
    edge[cnt].next=head[v];
    head[v]=cnt++;
}
bool chack(int src)
{
    int t=head[src];
    while(t!=-1)
    {
        if(!vis[edge[t].to])return true;
        t=edge[t].next;
    }
    return false;
}
long long llaabs(long long num)
{
    if(num<0)num=-num;
    return num;
}
long long dfs(int src)
{
    long long ans=weight[src],temp;
    vis[src]=true;
    if(chack(src))
    {
        int t=head[src];
        while(t!=-1)
        {
            if(!vis[edge[t].to])
            {
                temp=dfs(edge[t].to);
                min1=min(min1,llaabs(sum-temp-temp));
                ans+=temp;
            }
            t=edge[t].next;
        }
    }
    return ans;
}
int main()
{
    int case1=1;
    while(scanf("%d%d",&n,&m),n||m)
    {
        cnt=0;
        int u,v;
        min1=inf;
        sum=0;
        memset(vis,false,sizeof(vis));
        memset(head,-1,sizeof(head));
        for(int i=1; i<=n; i++)
        {
            scanf("%lld",&weight[i]);
            sum+=weight[i];
        }
        for(int i=0; i<m; i++)
        {
            scanf("%d%d",&u,&v);
            addedge(u,v);
        }
        dfs(1);
        printf("Case %d: %lld\n",case1++,min1);
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116301.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月23日 上午11:00
下一篇 2022年1月23日 上午11:00


相关推荐

  • ZMQ简介

    ZMQ简介一 ZeroMQ 的背景介绍官方 ZMQ 以下 ZeroMQ 简称 ZMQ 是一个简单好用的传输层 像框架一样的一个 socketlibrar 他使得 Socket 编程更加简单 简洁和性能更高 是一个消息处理队列库 可在多个线程 内核和主机盒之间弹性伸缩 ZMQ 的明确目标是 成为标准网络协议栈的一部分 之后进入 Linux 内核 现在还未看到它们的成功 但是 它无疑是极具前景的 并且是人们更加需要的 传

    2026年3月16日
    4
  • 史上最全的黑苹果系统「MacOS」安装教程,小白也能秒掌握!

    史上最全的黑苹果系统「MacOS」安装教程,小白也能秒掌握!公众号关注「奇妙的Linux世界」设为「星标」,每天带你提升技术视野!关于黑苹果折腾过的人应该不陌生,自从苹果采用Intel的处理器,被解锁后可以安装在IntelCPU与…

    2022年6月12日
    59
  • Claude Code + GLM-4.5,最强性价比编程组合教程首发

    Claude Code + GLM-4.5,最强性价比编程组合教程首发

    2026年3月16日
    2
  • windows 同步其他windows时间 w32time

    windows 同步其他windows时间 w32time一 介绍 nbsp nbsp 在 windows 平台下有 w32time 服务 w32time 服务有两种模式 服务器模式 客户端模式 默认只开启客户端模式 用于和其他的时间服务器同步 作为时间服务器 需要开启服务器模式 二 服务器设置 nbsp nbsp 1 修改注册表 nbsp nbsp nbsp 键值 HKEY LOCAL MACHINE SYSTEM CurrentContr Services W32Time TimeProv

    2025年7月28日
    3
  • NIO与传统IO的区别

    NIO与传统IO的区别传统的socket IO中,需要为每个连接创建一个线程,当并发的连接数量非常巨大时,线程所占用的栈内存和CPU线程切换的开销将非常巨大。使用NIO,不再需要为每个线程创建单独的线程,可以用一个含有限数量线程的线程池,甚至一个线程来为任意数量的连接服务。由于线程数量小于连接数量,所以每个线程进行IO操作时就不能阻塞,如果阻塞的话,有些连接就得不到处理,NIO提供了这种非阻塞的能力。小量的线…

    2022年6月13日
    28
  • 操作系统(第四版)期末复习总结(上)

    操作系统(第四版)期末复习总结(上)马上要考操作系统了,第一章操作系统引论1、操作系统是什么?操作系统为用户完成所有“硬件相关,应用无关“的工作,以给用户方便、高效、安全的使用环境1.1、定义:操作系统是一个大型的程序系统,它负责计算机的全部软、硬件资源的分配、调度工作,控制并协调多个任务的活动,实现信息的存取和保护。它提供用户接口,使用户获得良好的工作环境。1.2、目标(1)、方便性:配置OS后计算机系统更容易使用(2)、…

    2022年6月8日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号