第一行是兩個整數 ,依次表示修為等級差距限制和m,n(1< =m< =20,1< =n< =20000)物品的總數。接下來按照編號從小到大依次給出了n個物品的描述。每個物品的描述開頭是p,l,x三個非負整數 ( x< n),依次表示該物品的代價、主人精靈的修為等級和替代品總數。接下來x 行每行包括兩個整數t 和v ,分別表示替代品的編號和「***格」。(σx< =200000)
輸出格式
對於每個測試資料,在單獨一行內輸出最少需要的精靈寶石數。
樣例輸入
1 4
10000 3 2
2 8000
3 5000
1000 2 1
4 200
3000 2 1
4 200
50 2 0
樣例輸出
5250
思路:方案一:我們在乙個物品及其優惠商品間增加一條路徑,該路徑的值為負,即其***格。同時我們給每個節點都設定乙個權值,即其代價,達到此點時需要消耗這樣的代價。這樣,每個點到根節點的路徑長度,實際上就是經過一系列轉換後(最後一次轉換是獲得此節點)所需要的寶石。這樣,我們求出每個點到根節點的最短路,再找出其中最短的一條最短路,就是答案了。
方案二:新建乙個點0,表示什麼都還沒有,也就是起點,每乙個物品作為乙個點,到了這個點表示我當前手上拿的就是這個物品,0向其它的點連邊,邊權為物品本身的價值,表示我可以直接購買,可以替換的就連有向邊,邊權為替換的價錢,最後所求的就是從0到1的最短路。
比較一下兩種方案,事實上並沒有什麼區別。。。。。。但方案二提供了乙個超級源的思路,可以借鑑。
**:
#includeusing namespace std;
const int n=20010; const int m=250010;
struct way way[m];
int c,n,m,k,a,cnt,cur,ans,minn,r,l,head[n],cost[n],grade[n],dis[n],num[n];
void add(int u,int v,int w)
queueq;
void spfa(int st,int low)
for(int i=head[cur];i;i=way[i].next)
} }for(int i=1;i<=n;i++)
ans=min(ans,dis[i]);
}int main()
} ans=cost[1];
for(int i=l;i+c<=r;i++)
spfa(1,i);
printf("%d",ans);
return 0;
}
計蒜客 2019計蒜之道D
題意 現在給定你乙個字串 s ss 以及乙個整數 k kk,請求出 s ss的字典序最小的長度為 k kk的子串行。資料範圍 0 s 5000000 00 s 5000 000 樣例輸入 helloworld 5樣例輸出 ellld思路 假如我們先不考慮長度為k的限制我們應當怎麼做?我們以樣例為例子...
計蒜客 解碼
蒜頭君自己發明了一種字串的編碼方式,對於只含有大小寫字母的字串,可以用數字來表示括號裡面的串連續出現的次數 數字有可能超過一位數 比如a abcd 2等價於aabcdabcd。特別地,如果數字前面沒有括號,表示緊貼數字的前面的 乙個字母 出現的次數。比如abc2表示abcc。為了降低解碼的難度,蒜頭...
計蒜客 郊遊
蒜頭君成為了計蒜客附屬幼兒園的一名老師,乙個陽光明媚的週末,蒜頭君帶領著小朋友們去野外郊遊。一共有 2n2n 個小朋友,正好是 n n 個男孩和 n n 個女孩。蒜頭君讓小朋友分組玩遊戲,每組乙個男孩和乙個女孩,但是有些女孩比較討厭某些男孩,不願意和他們分在一組,男孩覺得和誰分在一組都無所謂。你能告...