L2_001緊急救援(Dijkstra)

作為一個(gè)城市的應(yīng)急救援隊(duì)伍的負(fù)責(zé)人叠纹,你有一張?zhí)厥獾娜珖?guó)地圖氓润。在地圖上顯示有多個(gè)分散的城市和一些連接城市的快速道路。每個(gè)城市的救援隊(duì)數(shù)量和每一條連接兩個(gè)城市的快速道路長(zhǎng)度都標(biāo)在地圖上。當(dāng)其他城市有緊急求助電話給你的時(shí)候斤富,你的任務(wù)是帶領(lǐng)你的救援隊(duì)盡快趕往事發(fā)地,同時(shí)锻狗,一路上召集盡可能多的救援隊(duì)满力。


輸入格式:
輸入第一行給出4個(gè)正整數(shù)N、M轻纪、S油额、D,其中N(2<=N<=500)是城市的個(gè)數(shù)刻帚,順便假設(shè)城市的編號(hào)為0~(N-1)潦嘶;M是快速道路的條數(shù);S是出發(fā)地的城市編號(hào)崇众;D是目的地的城市編號(hào)掂僵。第二行給出N個(gè)正整數(shù),其中第i個(gè)數(shù)是第i個(gè)城市的救援隊(duì)的數(shù)目顷歌,數(shù)字間以空格分隔锰蓬。隨后的M行中,每行給出一條快速道路的信息眯漩,分別是:城市1芹扭、城市2、快速道路的長(zhǎng)度赦抖,中間用空格分開舱卡,數(shù)字均為整數(shù)且不超過500。輸入保證救援可行且最優(yōu)解唯一队萤。
輸出格式:
第一行輸出不同的最短路徑的條數(shù)和能夠召集的最多的救援隊(duì)數(shù)量轮锥。第二行輸出從S到D的路徑中經(jīng)過的城市編號(hào)。數(shù)字間以空格分隔要尔,輸出首尾不能有多余空格交胚。


輸入樣例:
4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2
輸出樣例:
2 60
0 1 3


  • 思路
    首先就是采用dijkstra算法,并且用優(yōu)先隊(duì)列來優(yōu)化盈电,便于最小dist的查找
    注意當(dāng)找到一條與當(dāng)前路徑長(zhǎng)度相等的新路時(shí)蝴簇,路的總條數(shù)并不是加1,而是加上到上一個(gè)點(diǎn)的路徑條數(shù)
    注意走到起點(diǎn)的路的條數(shù)要初始化為1
#include <iostream>
#include <queue>
#include <cstring>
#define INF 1000
#define N 510
using namespace std;
struct node {
    int num, val;

    friend bool operator<(node a, node b)
    {
        return a.val>b.val;
    }
};
int visited[N];
int dis[N];
int edge[N][N];
int numpeo[N];
int maxpeo[N];
int cur[N];//當(dāng)前最短路徑長(zhǎng)度
int pnum[N];//最大召集數(shù)情況下的上一個(gè)點(diǎn)
priority_queue<node> que;
int n, m, s, d;
void Dijkstra(int s, int t)
{
    cur[s] = 1;//注意這步的初始化不要漏
    pnum[s] = -1;//源點(diǎn)的上一個(gè)點(diǎn)匆帚,輸出路徑時(shí)會(huì)用到
    dis[s] = 0;
    node no;
    no.num = s;
    no.val = 0;
    que.push(no);
    //要訪問t的時(shí)說明能走到t的所有路徑都訪問過了
    while (!que.empty()) {
        while (visited[que.top().num]) que.pop();
        visited[que.top().num] = 1;
        if (que.top().num == t)
            break;
        for (int i = 0; i < n;++i)
            if ((!visited[i]) && edge[que.top().num][i]!=-1) {
                //注意此處循環(huán)到是也會(huì)跳過因?yàn)橐呀?jīng)visited過了
                //所以不用怕cur會(huì)因?yàn)檠h(huán)到自己了邊是0導(dǎo)致長(zhǎng)度相等而加1
                if (dis[i] == dis[que.top().num] + edge[que.top().num][i]) {
                    cur[i]+=cur[que.top().num];//注意此處并不是加1
                    if (maxpeo[i] < maxpeo[que.top().num] + numpeo[i]) {
                        maxpeo[i] = maxpeo[que.top().num] + numpeo[i];
                        pnum[i] = que.top().num;
                    }
                }
                if (dis[i] > dis[que.top().num] + edge[que.top().num][i]) {
                    dis[i] = dis[que.top().num] + edge[que.top().num][i];
                    cur[i] = cur[que.top().num];//注意這步并不是更新為1
                    pnum[i] = que.top().num;
                    maxpeo[i] = maxpeo[que.top().num] + numpeo[i];
                    no.num = i;
                    no.val = dis[i];
                    que.push(no);
                }
            }
        que.pop();
    }
}
int main()
{
    cin >> n >> m >> s >> d;
    memset(visited, 0, sizeof(visited));
    //調(diào)試的是后發(fā)現(xiàn)dis全被初始化成一個(gè)很大的負(fù)值
        //關(guān)于memset的問題在其他筆記里另寫
    memset(dis, 127, sizeof(dis));
    memset(edge, -1, sizeof(edge));
    memset(cur, 0, sizeof(cur));
    for (int i = 0; i < n; ++i) {
        cin >> numpeo[i];
        maxpeo[i] = numpeo[i];
        edge[i][i] = 0;
    }
    for (int i = 1; i <= m; ++i)
    {
        int start, end, length;
        cin >> start >> end >> length;
        edge[start][end] = edge[end][start] = length;
    }
    Dijkstra(s, d);
    cout << cur[d] << " " << maxpeo[d]<<endl;
    int p = d;
    int path[N];
    int num=-1;
    while (p!=-1) {
        ++num;
        path[num] = p;
        p = pnum[p];
    }
    for (int i = num; i >= 0; --i) {
        cout << path[i];
        if (i)
            cout << " ";
    }
    system("pause");
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熬词,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌互拾,老刑警劉巖歪今,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異颜矿,居然都是意外死亡寄猩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門骑疆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來田篇,“玉大人,你說我怎么就攤上這事箍铭〔醇恚” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵诈火,是天一觀的道長(zhǎng)兽赁。 經(jīng)常有香客問我,道長(zhǎng)冷守,這世上最難降的妖魔是什么刀崖? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮拍摇,結(jié)果婚禮上亮钦,老公的妹妹穿的比我還像新娘。我一直安慰自己授翻,他們只是感情好或悲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布孙咪。 她就那樣靜靜地躺著堪唐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翎蹈。 梳的紋絲不亂的頭發(fā)上淮菠,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音荤堪,去河邊找鬼合陵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛澄阳,可吹牛的內(nèi)容都是我干的拥知。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼碎赢,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼低剔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤襟齿,失蹤者是張志新(化名)和其女友劉穎姻锁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猜欺,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡位隶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了开皿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涧黄。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖副瀑,靈堂內(nèi)的尸體忽然破棺而出弓熏,到底是詐尸還是另有隱情,我是刑警寧澤糠睡,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布挽鞠,位于F島的核電站,受9級(jí)特大地震影響狈孔,放射性物質(zhì)發(fā)生泄漏信认。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一均抽、第九天 我趴在偏房一處隱蔽的房頂上張望嫁赏。 院中可真熱鬧,春花似錦油挥、人聲如沸潦蝇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)攘乒。三九已至,卻和暖如春惋鹅,著一層夾襖步出監(jiān)牢的瞬間则酝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工闰集, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沽讹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓武鲁,卻偏偏與公主長(zhǎng)得像爽雄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沐鼠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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

  • 這個(gè)不錯(cuò)分享給大家挚瘟,從扣上看到的,就轉(zhuǎn)過來了 《電腦專業(yè)英語(yǔ)》 file [fail] n. 文件;v. 保存文...
    麥子先生R閱讀 6,566評(píng)論 5 24
  • 生活大爆炸版石頭剪刀布 題目描述 石頭剪刀布是常見的猜拳游戲:石頭勝剪刀刽沾,剪刀勝布本慕,布勝石頭。如果兩個(gè)人出拳一樣侧漓,...
    bbqub閱讀 453評(píng)論 0 0
  • Chance events play a much larger role in life than many p...
    DREAMRUNNER閱讀 536評(píng)論 0 1
  • 很久沒有寫文字锅尘,以前經(jīng)常寫在日記里!現(xiàn)在慢慢浮出這里的水面上布蔗! 我是一個(gè)有很多人一起努力才會(huì)動(dòng)力十足的人藤违,很多事情...
    紫色的輕紗閱讀 520評(píng)論 0 0
  • 001 財(cái)務(wù)自由的定義 從現(xiàn)在起不再工作,你依然能保持現(xiàn)有生活水平并延續(xù)到下一代纵揍。 002 學(xué)會(huì)正確的對(duì)待金錢 了...
    Alice_曌閱讀 722評(píng)論 1 1