Meeting(最短路 虛擬點)

2022-06-18 14:12:17 字數 1378 閱讀 7044

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

建圖:每個集合建乙個虛擬點,這個虛擬點連線集合內的所有點,權值為 t ,答案最後 / 2(通過虛擬點來建圖,每個權值都會經歷兩遍(可以畫圖看看),所以最後的答案要 / 2 );

**

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define inf 0x3f3f3f3f

#define pir pair

using

namespace std;

const

int maxn=

2e6+10;

int cnt,head[maxn]

;ll a[maxn]

,b[maxn]

,c[maxn]

,ans[maxn]

,dis[maxn]

;bool vis[maxn]

;struct node

edge[maxn]

;void

init()

void

add(

int u,

int v,

int w)

void

dijkstra

(int s));

while

(q.size()

));}

}}}int

main()

}dijkstra(1

);for(

int i=

1;i<=n;i++

) a[i]

=dis[i]

;dijkstra

(n);

for(

int i=

1;i<=n;i++

) b[i]

=dis[i]

;for

(int i=

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

(minn==inf)

printf

("case #%d: evil john\n"

,++tot)

;else

for(

int i=

0;i}return0;

}

HDU 5521 Meeting 拆點 最短路

題目鏈結 給m個由圖中結點組成的點集,點集中的點兩兩連通且距離為相等的ti。現有兩人分別從1和n點處同時出發嗎,問能否相遇以及相遇的最短時間。很容易想到直接分別以點1和點n為起始點求最短路,再遍歷各個點即可求得最短相遇時間。然而建圖上卻有問題 這個題中的邊是以點集的形式給出,極端情況下可能會出現有1...

HDU 5521 Meeting 拆點 最短路

題目鏈結 給m個由圖中結點組成的點集,點集中的點兩兩連通且距離為相等的ti。現有兩人分別從1和n點處同時出發嗎,問能否相遇以及相遇的最短時間。很容易想到直接分別以點1和點n為起始點求最短路,再遍歷各個點即可求得最短相遇時間。然而建圖上卻有問題 這個題中的邊是以點集的形式給出,極端情況下可能會出現有1...

K點最短路

給定乙個n個點m條邊的有向圖,有k個標記點,要求從規定的起點按任意順序經過所有標記點到達規定的終點,問最短的距離是多少。第一行5個整數n m k s t,表示點個數 邊條數 標記點個數 起點編號 終點編號。接下來m行每行3個整數x y z,表示有一條從x到y的長為z的有向邊。接下來k行每行個整數表示...