NOIP2013模擬 四葉草魔杖

2021-07-12 00:05:39 字數 2667 閱讀 1635

description

魔杖**freda融合了四件**,於是魔杖頂端緩緩地生出了一棵四葉草,四片葉子煥發著淡淡的七色光。聖劍**rainbow取出了乙個圓盤,圓盤上鑲嵌著n顆寶石,編號為0~n-1。第i顆寶石的能量是ai。如果ai>0,表示這顆寶石能量過高,需要把ai的能量傳給其他寶石;如果ai<0,表示這顆寶石的能量過低,需要從其他寶石處獲取-ai的能量。保證sigma(ai)=0。只有當所有寶石的能量均相同時,把四葉草魔杖插入圓盤**,才能開啟超自然之界的通道。

不過,只有m對寶石之間可以互相傳遞能量,其中第i對寶石之間無論傳遞多少能量,都要花費ti的代價。探險隊員們想知道,最少需要花費多少代價才能使所有寶石的能量都相同?

input

第一行兩個整數n、m。

第二行n個整數ai。

接下來m行每行三個整數pi,qi,ti,表示在編號pi和qi的寶石之間傳遞能量需要花費ti的代價。資料保證每對pi、qi最多出現一次。

output

輸出乙個整數表示答案。無解輸出impossible。

sample input

3 350 -20 -30

0 1 10

1 2 20

0 2 100

sample output

data constraint

對於50%的資料,2<=n<=8。

對於100%的資料,2<=n<16,0<=m<=n*(n-1)/2,0<=pi,qi

1、找出所有能量為0的集合。若該集合的點是聯通的,那麼求出該集合的mst,生成樹的值就是該集合能量轉移所需的最小代價。

2、將每一集合為0的集合看成是乙個物品,利用揹包動態規劃求出最優解。

用二進位制來壓縮狀態,1代表節點在集合中,0代表不在。

比如數字s的二進位制形式為100111,表明0,1,2,5號節點在s表示的集合中。

題目最多有n(n<=16)個節點,因此s的範圍是0到(2^n)-1

用陣列sum[s],記錄集合s中包含的節點的能量之和。

對於每乙個能量和為0的集合x(sum[x]==0),若能得到一棵最小生成樹,用陣列value[x]記錄下該生成樹的代價

f[i]記錄平衡集合i中的節點的能量值,所需最小代價

對於集合i和j,若滿足sum[i]==0且sum[j]==0

那麼有f[i|j]=min(f[i|j],f[i]+cost[j]);

i|j表示集合i與集合j合併之後的集合

code

#include 

#include

#include

#include

#include

#define fo(i,a,b) for (int i=a;i<=b;i++)

#define fd(i,a,b) for (int i=a;i>=b;i--)

#define n 20

#define two 65536+5

#define inf 214748364

struct record

a[n*(n-1)/2];

using

namespace

std;

int dad[n],f[two],power[n],sum[two],value[two];

int n,m;

bool cmp(record a,record b)

int kruskal(int s)

}if (tree_tot+1

return inf;

else

return ans;

}int main()

if (f[tot]==inf) printf("impossible\n");

else

printf("%d\n",f[tot]);

return

0;}

standard process

[cpp] view plain copy print?

#include

#include

#include

using

namespace

std;

const

int inf=1000000000;

struct nodeedge[150];

int n,m,a[17],father[17],sum[1

<<17],cost[1

<<17],f[1

<<17];

bool cmp(node a,node b)

int kruskal(int s) //討論狀態s中包含的點,構成的最小生成樹

for(i=1;i<=m;i++)

if(((s>>edge[i].x)&1)&&((s>>edge[i].y)&1))//判斷狀態s中是否包含了邊i的兩個端點

} if(cnt+1!=tot) return inf; //若cnt+1else

return mincost;

} int main()

}

if(f[tot]==inf)printf("impossible\n");else

printf("%d\n",f[tot]);

return

0;

}

四葉草 介面

介面是一種新的抽象模板 所以我們用新的關鍵字來表示介面 inte ce。其實,介面是對類的補充。因為類是單繼承的,介面可以實現多繼承。我們學習的時候,可以介面當做是乙個更加抽象的抽象類。介面定義 修飾符 inte ce 介面名 預設例項方法 public default 返回值型別 方法名 引數 案...

四葉草 泛型

概念 泛型是一種未知的資料型別,引數化動態資料型別。e e element元素 t t type型別等 使用泛型和不使用泛型的區別 不適用泛型 好處 集合不使用泛型,預設型別是object型別,可以儲存任意型別 弊端 不安全,會引發型別轉換異常 泛型使用 泛型 引用資料型別 一般用26個大寫字母 最...

再看《蜂蜜與四葉草》

生活總會有百無聊賴的時候,前段時間曾幾度想翻開這第二季來看,但是第一季的句號畫得實在真太漂亮了,而常聽說續集質量都會大不如前,所以心怕會影響 第一季給我留下的美感,遲遲沒敢看。事隔十個月的今天,在第一季還在心中留有餘韻的情況下,我還是把第二季看完了 結論是沒讓我失望,這部作品真的很優 秀,細膩清新的...