• 「洛谷P3931」 SAC E#1


    P3931 SAC E#1 - 一道难题 Tree

    题目背景

    冴月麟和魏潇承是好朋友。

    题目描述

    冴月麟为了守护幻想乡,而制造了幻想乡的倒影,将真实的幻想乡封印了。任何人都无法进入真实的幻想乡了,但是她给前来救她的魏潇承留了一个线索。

    她设置了一棵树(有根)。树的每一条边上具有割掉该边的代价。

    魏潇承需要计算出割开这棵树的最小代价,这就是冴月麟和魏潇承约定的小秘密。

    帮帮魏潇承吧。

    注:所谓割开一棵有根树,就是删除若干条边,使得任何任何叶子节点和根节点不连通。

    输入输出格式

    输入格式:

    输入第一行两个整数n,S表示树的节点个数和根。

    接下来n-1行每行三个整数a、b、c,表示a、b之间有一条代价为c的边。

    输出格式:

    输出包含一行,一个整数,表示所求最小代价。

    输入输出样例

    输入样例#1:

    4 1
    1 2 1 
    1 3 1
    1 4 1
    

    输出样例#1:

    3
    

    输入样例#2:

    4 1
    1 2 3
    2 3 1
    3 4 2
    

    输出样例#2:

    1
    

    说明

    对于20%的数据,n <= 10

    对于50%的数据,n <= 1000

    对于100%的数据,n <= 100000


    写在前面

    lovny(YKJ):用树形DP呀?

    Venus(LYT):还在做网络流?

    。。。

    没必要!完全没必要!这道题DFS就够了!

    思路

    很明显,要使一个叶子节点到不了祖先,有两种选择:

    他的某个祖先到不了根节点

    它父亲->它 删了

    然后我们可以遍历一遍树。

    DFS( x, fa ) = (Sigma)min(DFS( i, x ) ( 存在边x->i), val(x->i) )

    fa是为了避免搜到父亲节点。

    若x为叶子节点,直接返回INF

    也就是说,要么断开x->i让i到不了根节点,下面就不用再删边了,要么让i到的了根节点,在下面某处再断开。

    他没说c的范围,保险起见开long long

    代码很短。。。真的很短。。。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define open(s) freopen( s".in", "r", stdin ), freopen( s".out", "w", stdout )
    #define MAXN 100005
    #define MAXM 200005
    #define LL long long
    
    int n, S;
    int hd[MAXN], to[MAXM], nxt[MAXM], tot(1);
    LL val[MAXM];
    
    void Add( int x, int y, int z ){
    	nxt[++tot] = hd[x]; hd[x] = tot; val[tot] = z; to[tot] = y;
    	nxt[++tot] = hd[y]; hd[y] = tot; val[tot] = z; to[tot] = x;
    }
    
    LL DFS( int x, int fa ){
    	LL ans(0); bool flg(0);
    	for ( int i = hd[x]; i; i = nxt[i] )
    		if ( to[i] != fa ) ans += min( DFS( to[i], x ), val[i] ), flg = 1;
    	if ( !flg ) return LONG_LONG_MAX;
    	return ans;
    }
    
    int main(){
    	scanf( "%d%d", &n, &S );
    	for ( int i = 1; i < n; ++i ){
    		int x, y; LL z;
    		scanf( "%d%d%lld", &x, &y, &z );
    		Add( x, y, z );
    	}
    	printf( "%lld
    ", DFS( S, S ) );
    	return 0;
    }
    
  • 相关阅读:
    详细讲解 关于Linux静态库和动态库的分析
    linux下的共享库(动态库)和静态库
    原子性
    TCP-心跳
    linux alsa pcm(此pcm非硬件pcm接口)
    linux音频 DAPM之二:audio paths与dapm kcontrol
    linux 音频驱动
    imx6qsbd kpp
    nand flash详解及驱动编写
    嵌入式Qt程序启动参数-qws 不需要X11桌面系统
  • 原文地址:https://www.cnblogs.com/louhancheng/p/10139191.html
Copyright © 2020-2023  润新知