NKOJ 2439 四叶草魔杖(最小生成树+状压dp/网络流)

这篇博客介绍了如何解决NKOJ 2439 四叶草魔杖的问题,这是一个涉及最小生成树和网络流的算法题目。通过两种方法,一是利用最小生成树结合动态规划,二是应用网络流理论,来确定使所有宝石能量相同的最小代价。文章提供了每种方法的思路和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2439 四叶草魔杖

问题描述
  
   魔杖护法Freda融合了四件武器,于是魔杖顶端缓缓地生出了一棵四叶草,四片叶子幻发着淡淡的七色光。圣剑护法rainbow取出了一个圆盘,圆盘上镶嵌着N颗宝石,编号为0~N-1。第i颗宝石的能量是Ai。如果Ai>0,表示这颗宝石能量过高,需要把Ai的能量传给其它宝石;如果Ai<0,表示这颗宝石的能量过低,需要从其它宝石处获取-Ai的能量。保证∑Ai =0。只有当所有宝石的能量均相同时,把四叶草魔杖插入圆盘中央,才能开启超自然之界的通道。
不过,只有M对宝石之间可以互相传递能量,其中第i对宝石之间无论传递多少能量,都要花费Ti的代价。探险队员们想知道,最少需要花费多少代价才能使所有宝石的能量都相同?

输入格式

第一行两个整数N、M。
第二行N个整数Ai。
接下来M行每行三个整数pi,qi,Ti,表示在编号为pi和qi的宝石之间传递能量需要花费Ti的代价。数据保证每对pi、qi最多出现一次。

输出格式

输出一个整数表示答案。无解输出Impossible

样例输入

3 3
50 -20 -30
0 1 10
1 2 20
0 2 100

样例输出

30

提示

对于 50% 的数据,2<=N<=8。
对于 100% 的数据,2<=N<=16,0<=M<=N*(N-1)/2,0<=pi,qi<N,-1000<=Ai<=1000,0<=Ti<=1000,∑Ai=0。

做法一:最小生成树+状压dp

枚举点集,若当前点集构成联通块且能量之和为0,显然当前联通块传递能量的最小代价是其最小生成树,因此将每个这样的联通块看成一个物品,背包dp算出最小费用即可。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{
  
  int x,y,z;};
bool cmp(node a,node b)
{
  
  return a.z<b.z;}
int n,m,A[20],S[66666],V[66666],F[66666],TOT;
int fa[20];
bool mark[20];
node P[200];
int GF(int x)
{
    if(fa[x]!=x)fa[x]=GF(fa[x]);
    return fa[x];
}
int Kruscal(int s)
{
    int i,j,fx,fy,x,y,k=1,tot=0,cnt=0,ans=0;
    memset(mark,0,sizeof(mark));
    for(i=1;i<=n;i++)if((1<<i-1)&s)tot++,mark[i]=1;
    for(i=1;i<=n;i++)fa[i]=i;
    while(k<=m&&cnt<tot)
    {
       
四叶草魔杖是一种神奇的武器,它由四件武器融合而成。当魔杖顶端生长出一棵四叶草时,它会散发出七色光芒。圆盘上镶嵌着N颗宝石,每颗宝石都有不同的能量。如果宝石的能量过高,需要将能量传递给其他宝石;如果能量过低,需要从其他宝石处获取能量。保证所有宝石的能量之和为0。只有当所有宝石的能量都相同时,才能插入四叶草魔杖并开启超自然之界的通道。然而,只有M对宝石之间可以互相传递能量,每对宝石之间传递能量都需要花费一定的代价。 探险队员们想知道,为了使所有宝石的能量都相同,最少需要花费多少代价。给定宝石的数量N,每对宝石之间传递能量的代价Ti,以及每颗宝石的能量Ai,你需要输出一个整数表示答案。如果无法使所有宝石的能量相同,则输出"Impossible"。 范例输入: 3 3 50 -20 -30 0 1 10 1 2 20 0 2 100 范例输出: 30 提示: 本题可以使用动态规划来解决,具体的解题思路可以参考动态规划的相关知识。 #### 引用[.reference_title] - *1* [【NOIP2013模拟】四叶草魔杖 题解](https://blog.csdn.net/CMC_YXY/article/details/118528208)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [BZOJ_3058_四叶草魔杖_kruscal+DP](https://blog.csdn.net/diaopang1934/article/details/102276134)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值