最短路 求最長最短路,求最短路的路徑

2021-10-10 06:41:04 字數 4523 閱讀 7361

hdu - 1595 find the longest of the shortest

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

inline

intread()

while

(ch>=

'0'&&ch<=

'9') s=s*

10+ch-

'0',ch=

getchar()

;return s*w;

}const

int maxn =

1e3+5;

int n,m;

int dis[maxn]

,pre[maxn]

,par[maxn]

;int e[maxn]

[maxn]

;bool vis[maxn]

,flag=

false

;void

dijskra

(int s)

vis[node]

=true;}

if(!flag)

}/* 題意:求最長最短路

* 分析:列舉每一邊進行刪減,每次再跑dijskra ,再取max即可

*/int

main()

int ans=

-inf,q=n;

flag=

false

;dijskra(1

);if(dis[n]

!=inf) ans=

max(dis[n]

,ans)

;while

(pre[q]!=-

1)// pre儲存的是最短路每一條邊,相當於路徑回溯過程

printf

("%d\n"

,ans);}

return0;

}

hdu - 3986 harry potter and the final battle

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

inline

intread()

while

(ch>=

'0'&&ch<=

'9') s=s*

10+ch-

'0',ch=

getchar()

;return s*w;

}const

int maxn =

1e3+5;

/*題意跟上一題差不多,需要考慮重邊,這題樸素dijskra跑肯定是t的,所以選擇了堆優化

* 我們需要記錄重邊,然後再列舉

*/int n,m;

int dis[maxn]

,pre[maxn]

,par[maxn]

,tot;

int e[maxn]

[maxn]

;bool vis[maxn]

,flag=

false

;struct edgeedge[

200005];

struct node};

int head[maxn]

;void

add_edge

(int u,

int v,

int w)

int cnt;

void

dijskra

(int s));

while

(!q.

empty()

));}

}}if(

!flag)

}void

spfa

(int s)

// spfa:佇列優化對鄰接矩陣更加友好吧}}

}int vise[maxn]

[maxn]

;int

main()

else

if(vise[u]

[v]>w)

}for

(int i=

1;i<=n;i++

)for

(int j=

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

(e[i]

[j]!=inf)

add_edge

(i,j,e[i]

[j])

;int ans=inf;

flag=

false

;dijskra(1

);ans=dis[n];if

(dis[n]

==inf)

int q=n;

while

(pre[q]!=-

1)if(ans==inf)

printf

("-1\n");

else

printf

("%d\n"

,ans);}

return0;

}

記錄路徑:

codeforces c. dijkstra?

題意:求1

~n的最短路,輸出最短路徑依次經過的點

分析:路徑回溯,輕鬆解決,但是注意inf的值,需要盡量開大一點

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

inline

intread()

while

(ch>=

'0'&&ch<=

'9') s=s*

10+ch-

'0',ch=

getchar()

;return s*w;

}const

int maxn =

2e5+5;

struct edgeedge[maxn<<2]

;int n,m;

int head[maxn]

,tot;

ll dis[maxn]

;ll inf=

1e17+5

;bool vis[maxn]

;struct node};

void

add_edge

(int u,

int v,ll w)

int ans[maxn]

,cnt=0;

int pre[maxn]

;void

dijskra

(int s));

while

(!q.

empty()

)),pre[y]

=x;}}}

}int

main()

dijskra(1

);if(dis[n]

==inf)

puts

("-1");

else

for(

int i=cnt;i>=

2;i--

)printf

("%d "

,ans[i]);

printf

("\n");

}return0;

}

spfa求最短路

給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出impossible。資料保證不存在負權迴路。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示點x和點y之間存在一條有向邊,邊長為z。輸...

Dijkstra求最短路

題目鏈結 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸出格式 輸出乙個整數,表示1...

Dijkstra求最短路

題目鏈結 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為非負值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸出格式 輸出乙個整數,表示...