staticint idx; staticint[] e, ne, h, w; staticint N, M; staticint[] tar; staticintINF=0x3f3f3f3f; staticboolean[] vis; static HashMap<String, Integer> dp = newHashMap<>();
//a->b publicstaticvoidadd(int a, int b, int c){ e[idx] = b; ne[idx] = h[a]; w[idx] = c; h[a] = idx++; }
publicstaticvoidmain(String... args)throws Exception{ BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in)); PrintWriterout=newPrintWriter(newBufferedOutputStream(System.out)); int[] in = read(br); N = in[0]; M = in[1]; h = newint[N+1]; e = newint[2*M+1]; ne = newint[2*M+1]; w = newint[2*M+1]; Arrays.fill(h, -1); tar = read(br); for (inti=0; i < M; i++) { int[] _in = read(br); add(_in[0], _in[1], _in[2]); add(_in[1], _in[0], _in[2]); }
// 初始化以各个点为源点的最短路 dijkstra(1); for (inti=0; i < tar.length; i++) { dijkstra(tar[i]); }
vis = newboolean[tar.length]; intres= INF; for (inti=0; i < tar.length; i++) { vis[i] = true; res = Math.min(res, dp.get(1 + "," + tar[i]) + dfs(i)); vis[i] = false; } out.println(res); out.flush(); }
publicstaticintdfs(int c) { booleanflag=false; intres= INF; for (inti=0; i < tar.length; i++) { if (vis[i]) continue; vis[i] = true; res = Math.min(res, dp.get(tar[c] + "," + tar[i]) + dfs(i)); vis[i] = false; flag = true; } if (!flag) { return0; } return res; }
publicstaticvoiddijkstra(int s) { int[] dis = newint[N+1]; Arrays.fill(dis, INF); PriorityQueue<Integer> pq = newPriorityQueue<>((a, b) -> dis[a] - dis[b]); dis[s] = 0; pq.add(s); boolean[] vis = newboolean[N+1]; while (!pq.isEmpty()) { inti= pq.poll(); if (vis[i]) continue; vis[i] = true; for (intj= h[i]; j != -1; j = ne[j]) { if (dis[i] + w[j] < dis[e[j]]) { dis[e[j]] = dis[i] + w[j]; pq.add(e[j]); } } } for (inti=0; i < tar.length; i++) { dp.put(s + "," + tar[i], dis[tar[i]]); } }
staticintINF=0x3f3f3f3f; staticint [] price; staticint N, M; staticint idx; staticint[] e, ne, h1, h2; publicstaticvoidadd(int[] h, int a, int b) { e[idx] = b; ne[idx] = h[a]; h[a] = idx++; }
publicstaticvoidmain(String... args)throws Exception{ BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in)); int[] in = read(br); N = in[0]; M = in[1]; h1 = newint[N+1]; h2 = newint[N+1]; Arrays.fill(h1, -1); Arrays.fill(h2, -1); e = newint[(M+1)*4]; ne = newint[(M+1)*4]; int[] pMax = newint[N+1]; int[] pMin = newint[N+1]; //i-1 price = read(br);
for (inti=0; i < M; i++) { int[] t = read(br); inta= t[0], b = t[1]; add(h1, a, b); add(h2, b, a); if (t[2] == 2) { add(h1, b, a); add(h2, a, b); } }
spfa(h1, pMin, 1); spfa(h2, pMax, N);
intres=0; for (inti=1; i <= N; i++) { res = Math.max(res, pMax[i] - pMin[i]); } System.out.println(res); }
publicstaticvoidspfa(int[] h, int[] dp, int s) { boolean[] vis = newboolean[N+1]; booleanflag= s == 1; Arrays.fill(dp, flag ? INF : -INF); Queue<Integer> que = newLinkedList<>(); que.add(s); dp[s] = price[s-1]; vis[s] = true; while (!que.isEmpty()) { inti= que.poll(); vis[i] = false; for (intj= h[i]; j != -1; j = ne[j]) { intk= e[j]; if (flag) { if (dp[k] > Math.min(dp[i], price[k-1])) { dp[k] = Math.min(dp[i], price[k-1]); if (!vis[k]) { que.add(k); vis[k] = true; } } } else { if (dp[k] < Math.max(dp[i], price[k-1])) { dp[k] = Math.max(dp[i], price[k-1]); if (!vis[k]) { que.add(k); vis[k] = true; } } } } } }
staticintINF=0x3f3f3f3f; staticint[] dir = {1, 0, -1, 0, 1}; staticint N, M, P, K, S; // 第 i 个房间的钥匙 staticint[] key; // 邻接矩阵,权值为门的种类 staticint[][] w;
publicstaticvoidmain(String... args)throws Exception { PrintWriterout=newPrintWriter(newBufferedOutputStream(System.out)); BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in)); int[] in = read(br); N = in[0]; M = in[1]; P = in[2]; K = read(br)[0];
w = newint[N * M + 1][N * M + 1]; key = newint[N * M + 2]; for (inti=0; i <= N * M; i++) { Arrays.fill(w[i], -1); }
for (inti=0; i < K; i++) { int[] t = read(br); inta= flat(t[0], t[1]); intb= flat(t[2], t[3]); intg= t[4]; // a,b 两点之间有门或者墙 w[a][b] = w[b][a] = g; }
S = read(br)[0]; for (inti=0; i < S; i++) { int[] t = read(br); key[flat(t[0], t[1])] |= 1 << t[2]; }
out.println(bfs()); out.flush(); }
publicstaticintbfs() { // 最短距离以及手上钥匙的状态 Deque<int[]> queue = newArrayDeque<>(); int[][] dis = newint[N * M + 1][1 << (P + 1)]; for (inti=0; i < N * M + 1; i++) { Arrays.fill(dis[i], INF); } boolean[][] vis = newboolean[N * M + 1][1 << (P + 1)]; dis[1][key[1]] = 0; queue.offer(newint[] {1, key[1]}); while (!queue.isEmpty()) { int[] cur = queue.poll(); int[] t = unflat(cur[0]); inti= t[0], j = t[1]; intst= cur[1]; if (vis[cur[0]][st]) { continue; } vis[cur[0]][st] = true;
if (cur[0] == N * M) { return dis[cur[0]][cur[1]]; }
for (intk=0; k < 4; k++) { intnx= i + dir[k]; intny= j + dir[k + 1]; intnn= flat(nx, ny); if (nx < 1 || nx > N || ny < 1 || ny > M) { continue; }
var INF = int(0x3f3f3f3f) var MOD = 100003 var idx int var h []int var e []int var ne []int
funcadd(a, b int) { e[idx] = b ne[idx] = h[a] h[a] = idx idx++ }
funcmain() { // f, _ := os.Open("./input.txt") // reader := bufio.NewReader(f) var reader = bufio.NewReader(os.Stdin) in := ReadArray(reader) N, M := in[0], in[1] idx = 0 h = make([]int, N+1) for i := 0; i <= N; i++ { h[i] = -1 } e = make([]int, 2*M+1) ne = make([]int, 2*M+1) for i := 0; i < M; i++ { t := ReadArray(reader) add(t[0], t[1]) add(t[1], t[0]) }
var queue []int vis := make([]bool, N+1) dis := make([]int, N+1) for i := 0; i <= N; i++ { dis[i] = INF } queue = append(queue, 1) dis[1] = 1 forlen(queue) > 0 { i := queue[0] queue = queue[1:] if vis[i] { continue } vis[i] = true for j := h[i]; j != -1; j = ne[j] { k := e[j] dis[k] = Min(dis[k], dis[i]+1) queue = append(queue, k) } }
var INF = int(0x3f3f3f3f) var MOD = 100003 var idx int var h []int var e []int var ne []int
funcadd(a, b int) { e[idx] = b ne[idx] = h[a] h[a] = idx idx++ }
funcmain() { // f, _ := os.Open("./input.txt") // reader := bufio.NewReader(f) var reader = bufio.NewReader(os.Stdin) var writer = bufio.NewWriter(os.Stdout)
in := ReadArray(reader) N, M := in[0], in[1] idx = 0 h = make([]int, N+1) for i := 0; i <= N; i++ { h[i] = -1 } e = make([]int, 2*M+1) ne = make([]int, 2*M+1) for i := 0; i < M; i++ { t := ReadArray(reader) add(t[0], t[1]) add(t[1], t[0]) }
var queue []int dis := make([]int, N+1) for i := 0; i <= N; i++ { dis[i] = INF } dis[1] = 1 // dp[i]: 从 1 到 i 的最短路条数 dp := make([]int, N+1) queue = append(queue, 1) dp[1] = 1 forlen(queue) > 0 { i := queue[0] queue = queue[1:]
var INF = int(0x3f3f3f3f) var h []int var e []int var ne []int var w []int var idx int
funcAdd(a, b, c int) { w[idx] = c e[idx] = b ne[idx] = h[a] h[a] = idx idx++ }
funcmain() { reader := bufio.NewReader(os.Stdin) T := ReadArray(reader)[0] for ; T > 0; T-- { in := ReadArray(reader) N, M := in[0], in[1] idx = 0 h = make([]int, N+1) e = make([]int, M+1) ne = make([]int, M+1) w = make([]int, M+1)
for i := 0; i < len(h); i++ { h[i] = -1 }
for i := 0; i < M; i++ { t := ReadArray(reader) Add(t[0], t[1], t[2]) }
sf := ReadArray(reader) S, F := sf[0], sf[1]
fmt.Println(Dijkstra(S, F, N)) } }
funcDijkstra(s, f, n int)int { var pq NodeHeap dis := make([][2]int, n+1) cnt := make([][2]int, n+1) vis := make([][2]bool, n+1) heap.Push(&pq, &Node{s, 0, 0}) for i := 0; i <= n; i++ { dis[i][0] = INF dis[i][1] = INF } cnt[s][0] = 1 dis[s][0] = 0