思路這個題主要是建圖,建圖完成後,從 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行每行個整數表示...