Dijkstra(HDU 2544)

  • 適合不含負(fù)權(quán)邊的單源最短路
  • S:已找到的到源點(diǎn)的集合
  • dis[i]:頂點(diǎn)i到源點(diǎn)的最短路徑距離
  • 每次取不在S中dis最小的點(diǎn)v候醒,將v加入S, 并更新各點(diǎn)dis值

偽代碼
1.初始化S谷扣,將源點(diǎn)加入S
2.初始化dis吮龄,與源點(diǎn)有連接的為那條邊的值丽旅,否則為無窮大

while(S不包含所有頂點(diǎn))
{
         u=min{dis[u]|u不在S中}
         u加入S
         for(每個(gè)不在S中的點(diǎn)v&&dis[v]>dis[u]+w(uv))
               dis[v]=dis[u]+w(uv);
}

時(shí)間復(fù)雜度為O(n^2)染服,因?yàn)檎襍外的dis最小點(diǎn)要耗費(fèi)O(n)
此處用堆來優(yōu)化可降到O(nlgn)


HDU 2544
Problem Description
在每年的校賽里,所有進(jìn)入決賽的同學(xué)都會獲得一件很漂亮的t-shirt奔坟。但是每當(dāng)我們的工作人員把上百件的衣服從商店運(yùn)回到賽場的時(shí)候携栋,卻是非常累的!所以現(xiàn)在他們想要尋找最短的從商店到賽場的路線咳秉,你可以幫助他們嗎婉支?


Input
輸入包括多組數(shù)據(jù)。每組數(shù)據(jù)第一行是兩個(gè)整數(shù)N滴某、M(N<=100磅摹,M<=10000),N表示成都的大街上有幾個(gè)路口霎奢,標(biāo)號為1的路口是商店所在地户誓,標(biāo)號為N的路口是賽場所在地,M則表示在成都有幾條路幕侠。N=M=0表示輸入結(jié)束帝美。接下來M行,每行包括3個(gè)整數(shù)A晤硕,B悼潭,C(1<=A,B<=N,1<=C<=1000),表示在路口A與路口B之間有一條路庇忌,我們的工作人員需要C分鐘的時(shí)間走過這條路。
輸入保證至少存在1條商店到賽場的路線舰褪。


Output
對于每組輸入皆疹,輸出一行,表示工作人員從商店走到賽場的最短時(shí)間


Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2


思路:
用優(yōu)先隊(duì)列來優(yōu)化最小距離的查找
優(yōu)先隊(duì)列中的每一項(xiàng)是表示該店的下標(biāo)和dis的結(jié)構(gòu)體
用二維數(shù)組來存圖
定義一維數(shù)組visited存點(diǎn)是否被訪問過占拍,dis存距離源點(diǎn)的距離
首先每次執(zhí)行時(shí)都要初始化這幾個(gè)數(shù)組略就,visited全是0,dis全是一個(gè)超大的值晃酒,二維數(shù)組對角線0其他-1
dijkstra算法表牢,將源點(diǎn)入隊(duì),并且源點(diǎn)的dis要設(shè)為0(這步容易漏)贝次,while循環(huán)崔兴,隊(duì)列非空,并且終點(diǎn)還未被訪問過
找出隊(duì)列中優(yōu)先級最高(即dis最谢壮帷)且未被訪問過點(diǎn)
訪問設(shè)為是
對每個(gè)結(jié)點(diǎn)判斷是否未被訪問過與剛才找到的點(diǎn)是否有連接是否能使dis變小
如果可以更新dis敲茄,并入隊(duì)
pop剛才訪問的那個(gè)點(diǎn)


#include <iostream>
#include <queue>
#include <cstring>
#define N 110
#define INF 999999
using namespace std;
struct node {
    //優(yōu)先隊(duì)列中的結(jié)點(diǎn)
    int num;//點(diǎn)的編號
    int val;//到源點(diǎn)的距離

    friend bool operator<(node a, node b) {
        return a.val>b.val;
    }
};
int dis[N];//存到源點(diǎn)的距離
int edge[N][N];//存邊的權(quán)值
int visited[N];//存是否被訪問過
int v, e;
priority_queue<node> que;

int Dijkstra(int s, int t)
{
    //s源點(diǎn),t終點(diǎn)
    node n;
    dis[s] = 0;//注意這部別漏了
    n.num = s; n.val = 0;
    que.push(n);
    while (!que.empty() && (!visited[t])) {
        while (visited[que.top().num]) que.pop();
        visited[que.top().num] = 1;
        for (int i = 1; i <= v; ++i) {
            if ((!visited[i]) && edge[que.top().num][i] != -1)
                if (dis[i]>dis[que.top().num] + edge[que.top().num][i]) {
                    dis[i] = dis[que.top().num] + edge[que.top().num][i];
                    n.num = i; n.val = dis[i];
                    que.push(n);
                }
        }
        que.pop();
    }
    return dis[t];
}
int main()
{
    cin >> v >> e;
    while (v + e) {
        memset(dis, INF, sizeof(dis));
        memset(edge, -1, sizeof(edge));
        memset(visited, 0, sizeof(visited));
        while (!que.empty()) que.pop();
        for (int i = 1; i <= v; ++i)
        {
            edge[i][i] = 0;
        }
        for (int i = 1; i <= e; ++i)
        {
            //讀圖而且重下標(biāo)1開始存
            int beg, en, wgt;
            cin >> beg >> en >> wgt;
            edge[beg][en] = edge[en][beg] = wgt;
        }
        cout << Dijkstra(1, v) << endl;
        cin >> v >> e;
    }
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搁宾,一起剝皮案震驚了整個(gè)濱河市折汞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盖腿,老刑警劉巖爽待,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異翩腐,居然都是意外死亡鸟款,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門茂卦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來何什,“玉大人,你說我怎么就攤上這事等龙〈υ” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵蛛砰,是天一觀的道長罐栈。 經(jīng)常有香客問我,道長泥畅,這世上最難降的妖魔是什么荠诬? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上柑贞,老公的妹妹穿的比我還像新娘方椎。我一直安慰自己,他們只是感情好钧嘶,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布棠众。 她就那樣靜靜地躺著,像睡著了一般有决。 火紅的嫁衣襯著肌膚如雪摄欲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天疮薇,我揣著相機(jī)與錄音,去河邊找鬼我注。 笑死按咒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的但骨。 我是一名探鬼主播励七,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奔缠!你這毒婦竟也來了掠抬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤校哎,失蹤者是張志新(化名)和其女友劉穎两波,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闷哆,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腰奋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抱怔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劣坊。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖屈留,靈堂內(nèi)的尸體忽然破棺而出局冰,到底是詐尸還是另有隱情,我是刑警寧澤灌危,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布康二,位于F島的核電站,受9級特大地震影響乍狐,放射性物質(zhì)發(fā)生泄漏赠摇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一藕帜、第九天 我趴在偏房一處隱蔽的房頂上張望烫罩。 院中可真熱鬧洽故,春花似錦贝攒、人聲如沸时甚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荒适。三九已至梨熙,卻和暖如春刀诬,著一層夾襖步出監(jiān)牢的瞬間咽扇,已是汗流浹背陕壹。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工质欲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糠馆。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓嘶伟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親又碌。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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