K點最短路

2022-09-09 00:57:20 字數 1629 閱讀 1719

給定乙個n個點m條邊的有向圖,有k個標記點,要求從規定的起點按任意順序經過所有標記點到達規定的終點,問最短的距離是多少。

第一行5個整數n、m、k、s、t,表示點個數、邊條數、標記點個數、起點編號、終點編號。

接下來m行每行3個整數x、y、z,表示有一條從x到y的長為z的有向邊。

接下來k行每行個整數表示標記點編號。

輸出乙個整數,表示最短距離,若沒有方案可行輸出-1。

3 3 2 1 1

1 2 1

2 3 1

3 1 1

23

3
路徑為1->2->3->1。

20%的資料n<=10。

50%的資料n<=1000。

另有20%的資料k=0。

100%的資料n<=50000,m<=100000,0<=k<=10,1<=z<=5000。

【解題思路】

模板題,最短路+dfs

【code】

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9

using

namespace

std;

10const

int n=100005,m=15;11

long

long inf=0x7fffffffffffffff;12

using

namespace

std;

13int

n,m,k,s,t,flag[m],head[n],next[n],to[n],val[n],cnt;

14long

long f[m][m],d[n],ans=inf,sum;

15bool

visit[n],vis[m];

16 priority_queuelong

long,int>,vectorlong

long,int> >,greaterlong

long,int> > >q;

17void add(int x,int y,int

z)23

void dijkstra(int

s)27 memset(visit,0,sizeof

(visit));

28 d[s]=0;29

q.push(make_pair(d[s],s));

30while(!q.empty())

36 visit[x]=1;37

for(int i=head[x];i;i=next[i])43}

44}45}

46void dfs(int x,int

fa)51

for(int i=1;i<=k;i++)59}

60}61int

main()

69for(int i=1;i<=k;i++)

72for(int i=0;i<=k+1;i++)77}

78 dfs(0,0

);79

if(ans==inf)

82else

85return0;

86 }

遊戲 最短路,拆點

把問題抽象成圖論應該不難 也許都不用抽象?但是怎麼建邊怎麼跑就千差萬別了。首先應該注意到的一點是座標的範圍是0 500,也就是501 501個位置,所以陣列 佇列不要開小。另外題目給出的莉露露沒說位置不能重複,所以每個點可能不止入隊一次,仍然要注意陣列大小。剛開始一直在想複雜度與n掛鉤的演算法,但是...

Meeting(最短路 虛擬點)

思路這個題主要是建圖,建圖完成後,從 1 和 n 各自跑一遍dijkstra,分別得到從起點到各點的最短距離 a i 和 b i 然後用c i 來儲存從 1 和 n 出發的到 i 點距離的最大值 因為快的可以等慢的 同時維護乙個最小值答案 minn,最後再從小到大跑一遍看哪個點的 c i 與答案 m...

最短路 最短路徑問題

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