給定乙個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...