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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • netty消息推送系统_聊天服务器

    netty消息推送系统_聊天服务器简易聊天室转:忘了…以下为自动创建代理hub方式使用NuGet引用:Microsoft.AspNet.SignalR什么时候使用generatedproxy如果你要给客户端的方法注册多

    2022年8月5日
    6
  • jmeter并发接口测试教程_jmeter高并发测试

    jmeter并发接口测试教程_jmeter高并发测试jmeter并发测试实例,测试项目结构图如下:1.新建测试计划,选中测试计划,右键,添加线程组2.添加配置元件-用户定义的变量,用来放置ip和端口参数3.添加配置元件-CSV数据文件设置,将测试数据存在csv文件中,配置路径和需要读取的参数并发测试是模拟多个用户同一时间进行同一个操作,所以需要创建真实的用户数据,这里的真实不是指用户数据的真实性(比如手机号和身份证真实…

    2022年9月30日
    0
  • WiFi网络WPA2 KRACK漏洞分析报告「建议收藏」

    WiFi网络WPA2 KRACK漏洞分析报告「建议收藏」作者:阿里安全技术平台团队————————0x00漏洞概述安全研究员MathyVanhoef发现的WPA2协议的KRA(KeyReinstallationAttacks)漏洞,利用WPA2协议标准加密密钥生成机制上的设计缺陷,四次握手协商加密密钥过程中第三个消息报文可被篡改重放,导致在用密钥被重新安装。WiFi网络通过WPA…

    2022年6月10日
    40
  • 学习opencv之cvtColor

    opencv提供了cvtColor()函数,用于在图像中不同的色彩空间进行转换,用于后续处理。在使用cvtColor之前首先需要了解下基本的图像色彩模式,色彩模式决定了打印或显示的图片颜色。图像色彩模式位图模式位图模式是图像中最基本的格式,图像只有黑色和白色像素,是色彩模式中占有空间最小的,同样也叫做黑白图,它包含的信息量最少,无法包含图像中的细节,相当于只有0或者1一副彩色图如…

    2022年4月18日
    39
  • 转:MFC之COleVariant[通俗易懂]

    转:MFC之COleVariant[通俗易懂]COleVariant本质上是一个枚举,用同一种类型来表达不同的子类型。如同boost中的variant。例子[cpp]viewplaincopyCOleVariantvar(3.6f);floatv=var.fltVal;CStringstr(“testCOleVariant”);COleVariantvar2(st…

    2022年7月18日
    11
  • UpdatePanel的用法

    UpdatePanel的用法

    2021年12月9日
    36

发表回复

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

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