ACM新手DAY 6 最短路徑

2021-09-25 10:56:32 字數 3431 閱讀 5216

題目:兩個點之間可能有多條路線,求出從起點到終點的最短耗時

#include

#include

using namespace std;

#define maxn 999999

int n,m,g[

110]

[110

],dis[

110]

;bool visit[

110]

;int

dijkstra

(int src,

int des)

visit[src]

=true;

dis[src]=0

;for

(int i=

1;i<=n;i++)if

(temp==maxn)

break

; visit[k]

=true;

for(

int j=

1;j<=n;j++)}

return dis[des];}

intmain()

ans=

dijkstra(1

,n);

cout<}return0;

}

與上一題的區別就是起點和終點需要讀入,而且,存在不能找到從起點到終點的情況。思路是加乙個bl陣列初始化為0,出現過的城鎮置為1,只要那些城鎮都出現過,就一定有一條路從起點到終點。

要求路徑最短的時候,費用也最少。

int a , b , l , p ;

scanf

("%d%d%d%d"

,&a,

&b,&l,

&p);

if(g[a]

[b]>l)

else

if(g[a]

[b]==l && cost[a]

[b]>p)

for

(int j =

1; j<=n ; j++

)elseif(

!vis[j]

&& dis[k]

+g[k]

[j]==dis[j]

)}

題目:從起點到終點的最短路有m段,去掉其中某一段路可分別得到乙個新的最短路,求這些最短路中的最大值

#include

#include

const

int maxint =

999999

;int n, m;

int g[

1010][

1010

], dis[

1010

], vis[

1010];

int flag[

1010];

bool bl;

void

dijkstra

(int src)

*/ dis[src]=0

;for

(int i=

1;i<=n;i++)}

}}intmain()

bl = false;

dijkstra(1

);//實現一下標點

bl = true;

int maxx =0;

for(

int i = n ; i >

1; i = flag[i]

)printf

("%d\n"

,maxx );}

return0;

}

dijkstra演算法步驟

初始化:

1、將源點v

0v_0

v0​加到s中,即s[v

0]=t

ru

es[v_0] = true

s[v0​]

=tru

e;將v0到各個終點的最短路徑長度初始化為權值,即d[i

]=g.

arcs

[v0]

[vi]

,(vi

∈v−s

)d[i] = g.arcs[v0][vi],(vi∈v − s)

d[i]=g

.arc

s[v0

][vi

],(v

i∈v−

s);如果v

0v_0

v0​和頂點v

iv_i

vi​之間有弧,則將v

iv_i

vi​的前驅置為v

0v_0

v0​,即pat

h[i]

=v

0path[i] = v_0

path[i

]=v0

​,否則pat

h[i]

=−

1path[i] = −1

path[i

]=−1

。2、選擇下一條最短路徑的終點vk,使得:

d [k

]=mi

nd[i

]∣vi

∈v−s

d[k] = min

d[k]=m

ind[

i]∣v

i∈v−

s3、將v

kv_k

vk​加到s中,即s[v

k]=t

ru

es[v_k] = true

s[vk​]

=tru

e。4、更新從v

0v_0

v0​出發到集合v−s

v − s

v−s上任一頂點的最短路徑的長度,同時更改v

lv_l

vl​的前驅為v

kv_k

vk​。

若d [k

]+g.

arcs

[k][

l]

l]

d[k]+g.arcs[k][l]d[

k]+g

.arc

s[k]

[l]l]

,則d [l

]=d[

k]+g

.arc

s[k]

[l];

path

[l]=

kd[l]=d[k]+g.arcs[k][l]; path [l]=k

d[l]=d

[k]+

g.ar

cs[k

][l]

;pat

h[l]

=k;5、重複②~④ n−1次,即可按照路徑長度的遞增順序,逐個求得從v

0v_0

v0​到圖上其餘各頂點的最短路徑。 ↩︎

Day6 最短路徑 最短路徑問題

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

Day6 最短路徑 暢通工程續

某省自從實行了很多年的暢通工程計畫後,終於修建了很多路。不過路多了也不好,每次要從乙個城鎮到另乙個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人很困擾。現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。input 本題目包含多組資料,請處...

新手Python學習記錄Day6

使a中每項 1 a 0,1,2,3,4,5,6,7,8,9 for index,i in enumerate a a index i 1 a map lambda x x 1,a 構建匿名函式 a i 1 for i in range 10 重新構造了乙個列表 列表生成 l x x for x in...