次最短路+概率

今天補了一道之前的次最短路問題逼纸。

第一次接觸的次最短路是寒假...剛剛找了一波沒找到嗅蔬,還發(fā)現(xiàn)好多題陌生了==歌亲!

POJ3255
題意很簡單菇用,就是讓你求出次短路的距離。

分析:最開始的時候是按照寒假的思路陷揪,一個鄰接矩陣記錄邊惋鸥;最短路用Dijistra求杂穷,同時記錄最短路的路徑;然后將路徑中的一段路距離改為INF卦绣,一直調(diào)用Dijistra耐量。超內(nèi)存了。
優(yōu)化:鄰接表記錄邊信息滤港,記錄路徑時防止RE廊蜒,就改為手寫棧,超時了溅漾。
再優(yōu)化:看別人題解才知道山叮,Dijistra的優(yōu)化是用優(yōu)先隊列(小根堆)來的==。
這次的代碼主要就是注意一個細節(jié)兩種情況:
1.如果取出的這個點u到v的距離d2比最短路(dist[v])還短樟凄,那么就應(yīng)該把最短路(dist[v)]賦值給次短路(dist2[v])聘芜,同時更新最短路的值。
2.如果取出的這個點u的距離比最短路長但是比次短路短缝龄,那么就應(yīng)該賦值給次短路汰现。
這兩種情況因為都存在更新,所以必須都加入隊列叔壤。


#include<bits/stdc++.h>

#define ll long long
#define CLR(x) memset(x,0,sizeof(x))
#define MEM(a,x) memset(a,x,sizeof(a))

const int INF = 0x3f3f3f3f;

const int maxn = 100000+100;

using namespace std;

struct node{
    int to,cost;
    node(int _to,int _cost){
        to=_to; cost=_cost;
    }
    node(){}
};

int n,r;
int dist[5050],dist2[5050];

typedef pair<int,int>P;
vector<node>V[5050];

void Dijistra(){
    priority_queue<P ,vector<P>,greater<P> >pq;
    fill(dist,dist+n,INF); fill(dist2,dist2+n,INF);
    dist[0]=0;
    pq.push(P(0,0));
    while(!pq.empty()){
        P p=pq.top(); pq.pop();
        int v=p.second,d=p.first;
        if(dist2[v]<d) continue;
        for(int i=0;i<V[v].size();i++){
            node e=V[v][i];
            int d2=d+e.cost;
            if(dist[e.to]>d2){
                swap(dist[e.to],d2);
                pq.push(P(dist[e.to],e.to));
            }
            if(dist2[e.to]>d2 && dist[e.to]<d2){
                dist2[e.to]=d2;
                pq.push(P(dist2[e.to],e.to));
            }
        }
    }
    printf("%d\n",dist2[n-1]);
}

int main()
{
    //FILEIN
    //FILEOUT
    //std::ios::sync_with_stdio(false);
    while(scanf("%d%d",&n,&r)!=EOF){
        node now;
        for(int i=0;i<r;i++){
            int from;
            scanf("%d%d%d",&from,&now.to,&now.cost);
            from--;
            now.to--;
            V[from].push_back(now);
            swap(now.to,from);
            V[from].push_back(now);
        }
        Dijistra();
    }
    return 0;
}

概率的題是HDU5236(系統(tǒng)維護瞎饲,下次補鏈接)。
題意:有一個長度為n的字符炼绘,現(xiàn)在已知嗅战,每一秒鐘可能發(fā)生三件事,1.成功輸入一個字符(概率為1-p) 2.記錄當(dāng)前輸入位置(按下x字符) 3.系統(tǒng)崩了俺亮,必須回到上次記錄的位置(概率為p驮捍,上次記錄不存在則回到初始)。問:期望按下最小的字符數(shù)脚曾。

分析:首先假設(shè)不存在記錄东且,那么按字符數(shù)目的概率就是下面的dp[i]=dp[i-1]+px(dp[i]+1)+(1-p) 然后考慮,我們觀察程序中的dp表達式本讥,可以輕易發(fā)現(xiàn)珊泳,dp是呈指數(shù)級增長的,所以(從圖像拷沸?)要考慮當(dāng)分段是均勻時最優(yōu)色查。于是有了第二個for。最強的地方來了W采帧Q砹恕!勤庐!
i表示的是字符分為i段示惊;
quto表示每一段的長度好港;
ex表示分了之后的剩余量。
我們知道要把ex分到quto里面米罚,才能達到最均勻(不然會出現(xiàn)100%51=49的情況)钧汹。怎么分呢!其實由quto*i+ex=n就知道录择,將ex提quto份平分過去才是最好的拔莱!
在這里我們平分的想法就是(因為quto>ex)把ex分成ex份然后拿給quto。這樣就能保證最后答案的最大值與最小值僅相差1.

#include<bits/stdc++.h>

const int maxn = 1e5+100;
using namespace std;

int kk=1;
double dp[maxn];

void Solve()
{
    int n,x;
    double p;
    scanf("%d%lf%d",&n,&p,&x);
    dp[0]=0; double ans=INF;
    for(int i=1;i<=n;i++) dp[i]=(1+dp[i-1])/(1-p);
    for(int i=1;i<=n;i++){
        int quto=n/i;
        int ex=n%i;
        ans=min(ans,dp[quto+1]*ex+dp[quto]*(i-ex)+x*i);
    }
    printf("Case #%d: %.6f\n",kk++,ans);
}

int main()
{
    //FILEIN
    //FILEOUT
    //std::ios::sync_with_stdio(false);
    int Case=1,cases;
    scanf("%d", &Case); cases=Case;
    while(Case--){
        //printf("Case #%d:",cases-Case);
        Solve();
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隘竭,一起剝皮案震驚了整個濱河市塘秦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌动看,老刑警劉巖尊剔,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異菱皆,居然都是意外死亡须误,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門仇轻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來京痢,“玉大人,你說我怎么就攤上這事篷店〖酪” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵疲陕,是天一觀的道長方淤。 經(jīng)常有香客問我,道長蹄殃,這世上最難降的妖魔是什么臣淤? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮窃爷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姓蜂。我一直安慰自己按厘,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布钱慢。 她就那樣靜靜地躺著逮京,像睡著了一般。 火紅的嫁衣襯著肌膚如雪束莫。 梳的紋絲不亂的頭發(fā)上懒棉,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天草描,我揣著相機與錄音,去河邊找鬼策严。 笑死穗慕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的妻导。 我是一名探鬼主播逛绵,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼倔韭!你這毒婦竟也來了术浪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤寿酌,失蹤者是張志新(化名)和其女友劉穎胰苏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體醇疼,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡硕并,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了僵腺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲤孵。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辰如,靈堂內(nèi)的尸體忽然破棺而出普监,到底是詐尸還是另有隱情,我是刑警寧澤琉兜,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布凯正,位于F島的核電站,受9級特大地震影響豌蟋,放射性物質(zhì)發(fā)生泄漏廊散。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一梧疲、第九天 我趴在偏房一處隱蔽的房頂上張望允睹。 院中可真熱鬧,春花似錦幌氮、人聲如沸缭受。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽米者。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔓搞,已是汗流浹背胰丁。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喂分,地道東北人锦庸。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像妻顶,于是被迫代替她去往敵國和親酸员。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 這個不錯分享給大家讳嘱,從扣上看到的幔嗦,就轉(zhuǎn)過來了 《電腦專業(yè)英語》 file [fail] n. 文件;v. 保存文...
    麥子先生R閱讀 6,566評論 5 24
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗沥潭。 張土汪:刷leetcod...
    土汪閱讀 12,747評論 0 33
  • 歸去來兮邀泉。 1.1 說明 本篇為《挑戰(zhàn)程序設(shè)計競賽(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy閱讀 14,342評論 0 160
  • 元旦的前一天,一個遠方的朋友發(fā)來新年問候钝鸽,同時也交談了幾句工作近況汇恤。"今天特地去泡了個溫泉"他說,我頓了一頓拔恰,說"...
    瀾喃閱讀 3,999評論 5 6
  • 孩子 當(dāng)你了解這世界 請不要害怕 我會送你一束漂亮的花
    蒼軒客閱讀 215評論 0 1