日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

903. 昂贵的聘礼题解(建图挺有趣的)

發布時間:2024/1/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 903. 昂贵的聘礼题解(建图挺有趣的) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 昂貴的聘禮原題
  • 年輕的探險家來到了一個印第安部落里。在那里他和酋長的女兒相愛了,于是便向酋長去求親。酋長要他用 10000 個金幣作為聘禮才答應把女兒嫁給他。探險家拿不出這么多金幣,便請求酋長降低要求。酋長說:”嗯,如果你能夠替我弄到大祭司的皮襖,我可以只要 8000 金幣。如果你能夠弄來他的水晶球,那么只要 5000 金幣就行了。”探險家就跑到大祭司那里,向他要求皮襖或水晶球,大祭司要他用金幣來換,或者替他弄來其他的東西,他可以降低價格。探險家于是又跑到其他地方,其他人也提出了類似的要求,或者直接用金幣換,或者找到其他東西就可以降低價格。不過探險家沒必要用多樣東西去換一樣東西,因為不會得到更低的價格。探險家現在很需要你的幫忙,讓他用最少的金幣娶到自己的心上人。另外他要告訴你的是,在這個部落里,等級觀念十分森嚴。地位差距超過一定限制的兩個人之間不會進行任何形式的直接接觸,包括交易。他是一個外來人,所以可以不受這些限制。但是如果他和某個地位較低的人進行了交易,地位較高的的人不會再和他交易,他們認為這樣等于是間接接觸,反過來也一樣。因此你需要在考慮所有的情況以后給他提供一個最好的方案。為了方便起見,我們把所有的物品從 1 開始進行編號,酋長的允諾也看作一個物品,并且編號總是 1。每個物品都有對應的價格 P P P,主人的地位等級 L L L,以及一系列的替代品 T i Ti Ti 和該替代品所對應的”優惠” V i Vi Vi。如果兩人地位等級差距超過了 M M M,就不能”間接交易”。你必須根據這些數據來計算出探險家最少需要多少金幣才能娶到酋長的女兒。

    輸入格式
    輸入第一行是兩個整數 M M M N N N,依次表示地位等級差距限制和物品的總數。

    接下來按照編號從小到大依次給出了 N N N 個物品的描述。

    每個物品的描述開頭是三個非負整數 P P P L L L X X X,依次表示該物品的價格、主人的地位等級和替代品總數。

    接下來 X 行每行包括兩個整數 T T T V V V,分別表示替代品的編號和”優惠價格”。

    輸出格式
    輸出最少需要的金幣數。

    數據范圍
    1 ≤ N ≤ 100 1≤N≤100 1N100,
    1 ≤ P ≤ 10000 1≤P≤10000 1P10000,
    1 ≤ L , M ≤ N 1≤L,M≤N 1L,MN,
    0 ≤ X < N 0≤X<N 0X<N
    輸入格式

    1 4
    10000 3 2
    2 8000
    3 5000
    1000 2 1
    4 200
    3000 2 1
    4 200
    50 2 0

    輸出格式

    5250

    咳咳,本蒟蒻深夜做題,最短路剛剛入門(感覺這題還是挺有意思的),因此寫這題時還是有很多感觸的(從acwing上搬題,排版不好看,見諒)

    解題思路

    • 題意:首先,我們先來看題意,這是一道最短路(牽線 )題,題意就是說一個旅行家要娶酋長的女兒,然后酋長要求他給足夠的金幣,或者用不同的物品可以使金幣優惠(只能用一件物品),然后旅行家可不是就得找物品的主人要嗎,物品的主人可好,一樣的要求,可以以物抵物,也可以用金幣購物,然后如此迭代,假設娶酋長的女兒為1號物品,后面的以此類推,共有n個物品,然后每個物品會給出它的替代品(即用這個替代品加優惠的金幣可以交換這個物品),問旅行家最少能用多少金幣取到酋長的女兒(不得不說,結個婚真難 ),接下來,我們不妨先模擬一下樣例。( l e le le代表等級, i d id id代表編號)如下圖

      這張圖很好的描繪了各個物品之間的關系,但是此時我們忽略了一個問題,所有的物品我們都可以直接用金幣解決的,所以,對于每個點,我們發現都多出來一條邊,邊權是物品本身的價格,如下圖:

      將這個源點 S S S定義成虛擬源點,從虛擬源點可以引出 n n n條邊,連向 n n n個點,每條邊的邊權是每個點對應的價格,于是樣例各個物品間的關系都確定了,那么這道題就可以轉化成從虛擬源點 S S S到1號點之間的最短路徑,完成建圖后,這題就轉化成了最短路問題了。
    • 思路:我來看一下數據范圍, N N N是100數量級的,看地位等級差距限制也是100數量級的,我們來考慮一下各個算法的時間復雜度,樸素版 D i j k s t r a Dijkstra Dijkstra時間復雜度是 O ( n 2 ) O(n^2) O(n2),由于有地位等級限制(我們之前并沒有考慮這一點),所以我們必須保證每次交易的等級 l e v e l [ i ] level[i] level[i]滿足 ∣ l e v e l [ 1 ] ? m ∣ ≤ l e v e l [ i ] ≤ ∣ l e v e l [ i ] + m ∣ |level[1]-m|≤level[i]≤|level[i]+m| level[1]?mlevel[i]level[i]+m,(這樣我們才能保證最后能跟1號點交換物品),所以我們可以跑 m m m+1次 D i j k s t r a Dijkstra Dijkstra,那么時間復雜度就是 O ( n 2 m ) O(n^2m) O(n2m),完全合理,不會超時,再看堆優化版的 D i j k s t r a Dijkstra Dijkstra,邊數是 n 2 n^2 n2級別的,所以最后總的時間復雜度是 O ( n 3 l o g n ) O(n^3logn) O(n3logn),也沒問題,再看 S P F A SPFA SPFA,正常情況下 S P F A SPFA SPFA的復雜度是 O ( m ) O(m) O(m),最壞情況不會超過 O ( n 3 ) ) O(n^3)) O(n3))(本題邊數是點數的平方),所以總的復雜度可能達到 O ( n 4 ) O(n^4) O(n4),但大部分情況是 O ( n 3 ) O(n^3) O(n3),所以我們也可以試一試,再看 F l o y d Floyd Floyd,時間復雜度妥妥的 O ( n 4 ) O(n^4) O(n4),所以大概率會 T L E TLE TLE,因此我們就不用 F l o y d Floyd Floyd了(其實我也不會用 F l o y d Floyd Floyd寫這題,輕點罵 )

    代碼

    廢話說了那么多,最后還是上代碼~~~

    • 樸素版 D i j k s t r a Dijkstra Dijkstra
    #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N=110; int w[N][N],dist[N],level[N],n,m,res=0x3f3f3f3f; bool st[N]; int dij(int left,int right){memset(dist,0x3f,sizeof(dist));memset(st,0,sizeof st);//不要忘了memset,因為要m+1次 dist[0]=0;for(int i=1;i<=n;i++){int t=-1;for(int j=0;j<=n;j++){//j要從0開始,0是虛擬源點if(!st[j] && (t==-1 || dist[j]<dist[t])){t=j;}}st[t]=1;for(int j=1;j<=n;j++){if(level[j]>=left && level[j]<=right){dist[j]=min(dist[j],dist[t]+w[t][j]);}}}//Dijkstra模板 return dist[1]; } int main(){memset(w,0x3f,sizeof w);cin>>m>>n;for(int i=1;i<=n;i++) w[i][i]=0;//i到i的點 for(int i=1;i<=n;i++){int price,cnt;cin>>price>>level[i]>>cnt;w[0][i]=min(w[0][i],price);//0到i之間連了一條價格為price的邊//(min是防止重邊) (虛擬源點設成0) while(cnt--){int id,cost;cin>>id>>cost;w[id][i]=min(w[id][i],cost);//id到i之間連了一條邊權為cost的邊}}for(int i=level[1]-m;i<=level[1];i++){res=min(res,dij(i,i+m));//每個i即等級跑一遍Dijkstra }cout<<res<<endl;return 0; }
    • 堆優化版的 D i j k s t r a Dijkstra Dijkstra
    #include <iostream> #include <cstring> #include <queue> #include <cstdio> #include <vector> using namespace std; const int N=10010;//這里要存邊,數據范圍要開到10000+,不然會Segmentation Fault //(~~別問我怎么知道的~~) int idx,e[N],n,m,ne[N],v[N],level[N],dist[N],h[N],res=0x3f3f3f3f; bool st[N]; typedef pair<int,int> PII; void add(int a,int b,int c){e[idx]=b,v[idx]=c,ne[idx]=h[a],h[a]=idx++;//鄰接表存圖 } int dij(int left,int right){memset(dist,0x3f,sizeof dist);memset(st,0,sizeof st);dist[0]=0;priority_queue<PII,vector<PII>,greater<PII>> heap;heap.push({0,0});//這里也一樣,將0號點入隊while(heap.size()){PII t=heap.top();heap.pop();int ver=t.second,distance=t.first;if(st[ver]) continue;st[ver]=1;for(int i=h[ver];i!=-1;i=ne[i]){int j=e[i];if(level[j]>=left && level[j]<=right){//同樣要判斷等級限制范圍 if(dist[j]>distance+v[i]){dist[j]=distance+v[i];heap.push({dist[j],j}); }}}}return dist[1]; } int main(){cin>>m>>n;memset(h,-1,sizeof h);for(int i=1;i<=n;i++){int price,cnt;cin>>price>>level[i]>>cnt;add(0,i,price);//0到i建一條邊權為price的邊,min防止重邊 while(cnt--){int id,cost;cin>>id>>cost;add(id,i,cost);}} for(int i=level[1]-m;i<=level[1]+m;i++){res=min(res,dij(i,i+m));}cout<<res<<endl;return 0; }
    • 最后是我最喜歡的 S P F A SPFA SPFA(隔壁學校佬說是因為你沒被卡過才最喜歡,嘶~ )
    #include <iostream> #include <cstring> #include <queue> #include <vector> using namespace std; const int N=10010; int idx,dist[N],e[N],ne[N],h[N],v[N],n,m,level[N],res=0x3f3f3f3f; bool st[N]; void add(int a,int b,int c){e[idx]=b;v[idx]=c;ne[idx]=h[a];h[a]=idx++; } int spfa(int left,int right){memset(dist,0x3f,sizeof dist);memset(st,0,sizeof st);dist[0]=0;queue<int> q;q.push(0);st[0]=1;while(q.size()){int t=q.front();q.pop();st[t]=0;for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(level[j]>=left && level[j]<=right){if(dist[j]>dist[t]+v[i]){dist[j]=dist[t]+v[i];if(!st[j]){q.push(j);st[j]=1;}}}}}return dist[1]; } int main(){cin>>m>>n;memset(h,-1,sizeof h);for(int i=1;i<=n;i++){int price,cnt;cin>>price>>level[i]>>cnt;add(0,i,price);while(cnt--){int id,cost;cin>>id>>cost;add(id,i,cost);}}for(int i=level[1]-m;i<=level[1];i++) res=min(res,spfa(i,i+m));cout<<res<<endl;return 0;//思路與堆優化版的Dijkstra是一樣的,就是把模板換了換 }

    如果真有能看到這里的大佬,本蒟蒻真的十分感謝,因為也沒怎么寫過題解,如有錯誤,請大佬多多包涵(doge)(/拜謝//拜謝//拜謝/)!

    總結

    以上是生活随笔為你收集整理的903. 昂贵的聘礼题解(建图挺有趣的)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 天天爽天天色 | 午夜美女福利视频 | 精品国产精品国产偷麻豆 | 国产精品成人免费视频 | h部分肌肉警猛淫文 | 亚洲成人av一区 | 折磨小男生性器羞耻的故事 | 欧美1区2区3区4区 | 欧美亚洲 | 日本a级黄色 | 色婷婷激情 | 午夜激情视频在线播放 | 久久久久无码国产精品一区李宗瑞 | 久久精品视频免费看 | 爆乳熟妇一区二区三区 | 神马国产 | 国产视频手机在线播放 | 国产精品久久久久久久久免费相片 | 成人啪啪18免费游戏链接 | 日本一区二区三区视频在线播放 | 91精品在线观看入口 | 神马午夜伦理影院 | 精品无码一区二区三区电影桃花 | 五月婷婷视频在线 | 亚洲精品成人片在线观看精品字幕 | 一区二区三区啪啪啪 | 久久精品国产欧美亚洲人人爽 | 禁漫天堂免费网站 | 欧美一线高本道 | 国产三级午夜理伦三级 | 亚洲欧美日韩激情 | 99久久国产精 | 乱图区| 在线精品免费视频 | 激情丁香网 | 久草成人网 | 琪琪午夜伦理影院7777 | 国产三级伦理片 | 国产精品原创 | 国产午夜在线播放 | 日韩久久一区二区 | 精品人妻无码专区视频 | 欧美特级黄色录像 | 丰满秘书被猛烈进入高清播放在 | 国产爆乳无码一区二区麻豆 | 中文精品久久 | 先锋影音资源av | 日爽夜爽 | 欧美精品一区二区免费 | av在线片 | 伊人网狼人 | 91久久爽久久爽爽久久片 | 激情全身裸吻胸 | 99草在线视频 | 亚洲狼人社区 | 夜夜夜综合 | 亚洲色图第1页 | av在线天天 | 亚洲欧洲精品成人久久奇米网 | 天天操天天插 | 国产成人精品影视 | 亚洲伦理天堂 | 色一情一伦一子一伦一区 | 福利视频一二区 | 可以免费观看的毛片 | 久久奇米 | 豆花av| 日韩一区二区三区电影 | 国产人妻久久精品一区二区三区 | 日本一区二区三区在线观看视频 | 亚洲美女屁股眼交8 | 国产天堂 | 四虎永久在线精品免费一区二区 | 久久不卡免费视频 | 国产黄视频网站 | 熟妇熟女乱妇乱女网站 | 精品国产综合 | 夜夜嗨老熟女av一区二区三区 | 黄色一级淫片 | 日韩黄片一区二区 | 综合亚洲色图 | 91精品视频免费看 | 91高潮大合集爽到抽搐 | 日韩一区二区三区久久 | 老妇高潮潮喷到猛进猛出 | 亚洲欧美日韩一区在线观看 | 豆花视频在线 | 9i看片成人免费高清 | 国产欧美二区 | 欧美成人精品一区 | 可以在线观看的黄色 | 最近日韩免费视频 | 91天堂在线视频 | 狠狠躁狠狠躁视频专区 | 91免费视 | 在线视频观看一区二区 | 免费国产区 | 日韩美女黄色片 | 一级片免费在线观看 |