JZOJ 3470 最短路 最短路 DFS

2021-08-27 14:01:29 字數 1835 閱讀 1461

給定乙個n

nn個點m

mm條邊的有向圖,有k

kk個標記點,要求從規定的起點按任意順序經過所有標記點到達規定的終點,問最短的距離是多少。

最短路+dfs

首先,對於每乙個標記點和s

ss點,以它們為起點跑一邊spfa,由於k≤10

k\leq10

k≤10

,所以我們就可以得到乙個只有s

ss和標記點的乙個有向圖,圖的每條邊是原圖的最短路

然後就用dfs列舉標記點經過的順序,時間複雜度為o(k

!)

o(k!)

o(k!

),可以接受。跑完之後就更新答案,最後輸出最優答案。

對於k =0

k=0k=

0的兩個點,在跑完以s

ss為起點的最短路之後直接輸出dis

[t

]dis[t]

dis[t]

(或− 1-1

−1)即可。

有點醜,請見諒。

#include

#include

#include

#include

#define n 101000

#define inf 1e9

#define ll_inf 1e17

#define ll long long

using

namespace std;

int n,m,k,s,t,tot,x,y,z,head[n]

,dis[n]

,sp[21]

,a[21][

21];bool vis[n]

,p[21];

ll ans=ll_inf;

struct node

e[n]

;void

add(

int from,

int to,

int dis)

//存圖(原圖)

void

spfa

(int start)

//以start為原點的spfa

queue<

int> q;

q.push

(start)

; vis[start]=1

; dis[start]=0

;while

(q.size()

)}}}

}void

dfs(

int x,ll sum,

int dep)

//dfs列舉順序

for(

int i=

1;i<=k;i++

)//列舉下乙個到達的點

if(x!=i&&

!p[i])}

intmain()

for(

int i=

1;i<=k;i++

)scanf

("%d"

,&sp[i]);

spfa

(s);

//以s點為起點跑spfaif(

!k)//k為0的特殊情況

for(

int i=

1;i<=k;i++

) a[0]

[i]=dis[sp[i]];

//求每個點的圖

for(

int i=

1;i<=k;i++

)//以每乙個標記點開始跑spfa

dfs(0,

0,0)

;if(ans==ll_inf)

cout

}

JZOJ 3470 最短路 最短路 DFS

給定乙個n n個點m m條邊的有向圖,有k k個標記點,要求從規定的起點按任意順序經過所有標記點到達規定的終點,問最短的距離是多少。最短路 dfs 首先,對於每乙個標記點和s s點,以它們為起點跑一邊spfa,由於k 10 k 10 所以我們就可以得到乙個只有s s和標記點的乙個有向圖,圖的每條邊是...

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...