HAUTOJ 1262魔法寶石 優先佇列

2021-07-31 10:03:15 字數 776 閱讀 2119

題目鏈結

比賽場上是暴力懟過去的,回來補題學了個優先佇列的想法

因為寶石的合成情況可能有巢狀,比如1和2生成3,1和3生成2,2和3生成1,如果用dp去做的話,那麼就會形成乙個迴路,就沒辦法當做樹形dp搞了

所以我們要想到,如果出現了某個生成環,那麼其環三個元素中,魔力值最小的那個一定不可被更新,所以這個環本質上是不影響我們最終最優值的

因此,我們只需要構造乙個優先佇列,按照所有寶石的魔力值從小到大排序,依次出佇列依次對其他點進行更新即可

#includeusing namespace std;

const int maxn=1e5+500;

struct node

}a[maxn];

priority_queueq;

struct edgeedge[maxn*2];

int head[maxn],tot;

int t,n,m;

int dp[maxn];

void addedge(int a,int b,int c)

int main()

int x,y,z;

while(m--)

while(!q.empty()){

node t=q.top();

int u=t.id;

q.pop();

for(int i=head[u];i!=-1;i=edge[i].nxt){

int v=edge[i].b;

int w=edge[i].c;

if (dp[u]+dp[v]

haut 1262 魔法寶石 dij 堆優化)

時間限制 2 秒 記憶體限制 64 mb 提交 346 解決 85 提交 狀態 題目描述 小s想要創造n種魔法寶石。小s可以用ai的魔力值創造一棵第i種魔法寶石,或是使用兩個寶石合成另一種寶石 不消耗魔力值 請你幫小s算出合成某種寶石的所需的最小花費。輸入 第一行為資料組數t 1 t 3 對於每組資...

魔法寶石 spfa

時間限制 2 秒 記憶體限制 64 mb 提交 248 解決 48 提交 狀態 題目描述 小s想要創造n種魔法寶石。小s可以用ai的魔力值創造一棵第i種魔法寶石,或是使用兩個寶石合成另一種寶石 不消耗魔力值 請你幫小s算出合成某種寶石的所需的最小花費。輸入 第一行為資料組數t 1 t 3 對於每組資...

魔法寶石(思維啊 )

時間限制 2 秒 記憶體限制 64 mb 題目描述 小s想要創造n種魔法寶石。小s可以用ai的魔力值創造一棵第i種魔法寶石,或是使用兩個寶石合成另一種寶石 不消耗魔力值 請你幫小s算出合成某種寶石的所需的最小花費。輸入 第一行為資料組數t 1 t 3 對於每組資料,首先一行為n,m 1 n,m 10...