題目鏈結
比賽場上是暴力懟過去的,回來補題學了個優先佇列的想法
因為寶石的合成情況可能有巢狀,比如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...