九度OJ 題目1008 最短路徑問題

2021-07-04 10:28:43 字數 1453 閱讀 5811

一題目描述:

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。

輸入:

輸入n,m,點的編號是1~n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t;起點s,終點t。n和m為0時輸入結束。

(1樣例輸入:

3 21 2 5 6

2 3 4 5

1 30 0

樣例輸出:

9 11

二.題目分析

本題是典型的最短路徑問題,可以使用單源的dijkstra演算法。

需要提醒的地方是有兩處,一是注意題中的要求,在出現多條最短路徑時,選擇代價最小的一條。滿足此要求,需要改進兩個地方,在輸入時,有可能出現兩個點v1,v2之間兩條道路,距離相等,但是代價不等,因此輸入時需要做代價判斷更新(看了題解時才想到這點);另外,在在更新dist陣列時,不僅在出現更短距離時需要更新,同時當距離相等時,出現更小代價時也需要更新,這點很容易想到。

二是注意最大值的設定,題中並沒有給出最大值的上限,因此我們需要考慮int型的最大值作為inf(本**中是maxint),int型是4個位元組,即32位,有符號範圍的最大值是0x7fffffff,map[i][j]用此最大值作為上限需要格外小心,因為在更新dist陣列中一旦做加法便會溢位,解決方法有兩個,可以採用先判斷在做加法的方法,判斷map[i][j]注:在windows的記憶體管理機制中,程序的所有使用的位址都是虛擬位址,程序也是執行在虛擬記憶體中的,虛擬記憶體的位址和物理記憶體中的位址通過頁表進行轉換。在32位windows中,能夠表示的最大定址範圍就是4g,每乙個程序都獨享4g的虛擬記憶體。而windows採取是這樣子分配的:將4g空間分成兩部分,低2g的部分是給使用者使用的,而高2g的部分是保留給系統使用的。這樣子,每乙個進**正能夠使用的記憶體就只有2g。而這個2g,包括了棧和堆,以及存放常量和靜態資料的區域。2g 記憶體大小限制是windows(32位)的限制搜尋,是沒有辦法超越的。

三.**

#include #include #define max 1024

#define maxint 0x7fffffff //定義int型最大值

int e,v,map[max][max],cost[max][max];

void dijkstra(int start,int *dist,int *co)

else if(map[v1-1][v2-1]==p1&&cost[v1-1][v2-1]>p2) //輸入在距離相等時,更新最小的代價

}scanf("%d%d",&start,&end);

dijkstra(start-1,dist,co); //起點,距離陣列,代價陣列

printf("%d %d\n",dist[end-1],co[end-1]);

}return 0;

}

九度OJ 題目1008 最短路徑問題

題目描述 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入 輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 ...

九度oj 題目1008 最短路徑問題

題目描述 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入 輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 ...

九度OJ 1008 最短路徑問題

題目描述 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入 輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 ...