列表

详情


NC24723. [USACO 2010 Feb S]Chocolate Giving

描述

Farmer John is distributing chocolates at the barn for Valentine's day, and B (1 <= B <= 25,000) of his bulls have a special cow in mind to receive a chocolate gift.
Each of the bulls and cows is grazing alone in one of the farm's N (2*B <= N <= 50,000) pastures conveniently numbered 1..N and connected by M (N-1 <= M <= 100,000) bidirectional cowpaths of various lengths. Some pastures might be directly connected by more than one cowpath. Cowpath i connects pastures R_i and S_i (1 <= R_i <= N; 1 <= S_i <= N) and has length L_i (1 <= L_i <= 2,000).
Bull i resides in pasture P_i (1 <= P_i <= N) and wishes to give a chocolate to the cow in pasture Q_i (1 <= Q_i <= N).
Help the bulls find the shortest path from their current pasture to the barn (which is located at pasture 1) and then onward to the pasture where their special cow is grazing. The barn connects, one way or another (potentially via other cowpaths and pastures) to every pasture.
As an example, consider a farm with 6 pastures, 6 paths, and 3 bulls (in pastures 2, 3, and 5) who wish to bestow chocolates on their love-objects:                       *1  <-- Bull wants chocolates for pasture 1 cow              [4]--3--[5]  <-- [5] is the pasture ID             /  |            /   |           4    2          <-- 2 is the cowpath length          /     |               between [3] and [4]       [1]--1--[3]*6      /   \    /     9     3  2    /       \/  [6]      [2]*4 * The Bull in pasture 2 can travel distance 3 (two different ways) to get to the barn then travel distance 2+1 to pastures [3] and [4] to gift his chocolate. That's 6 altogether. * The Bull in pasture 5 can travel to pasture 4 (distance 3), then pastures 3 and 1 (total: 3 + 2 + 1 = 6) to bestow his chocolate offer. * The Bull in pasture 3 can travel distance 1 to pasture 1 and then take his chocolate 9 more to pasture 6, a total distance of 10.

输入描述

* Line 1: Three space separated integers: N, M, and B
* Lines 2..M+1: Line i+1 describes cowpath i with three space-separated integers: R_i, S_i, and L_i
* Lines M+2..M+B+1: Line M+i+1 contains two space separated integers: P_i and Q_i

输出描述

* Lines 1..B: Line i should contain a single integer, the smallest distance that the bull in pasture P_i must travel to get chocolates from the barn and then award them to the cow of his dreams in pasture Q_i

示例1

输入:

6 7 3 
1 2 3 
5 4 3 
3 1 1 
6 1 9 
3 4 2 
1 4 4 
3 2 2 
2 4 
5 1 
3 6 

输出:

6
6
10

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Pascal(fpc 3.0.2) 解法, 执行用时: 63ms, 内存消耗: 3168K, 提交时间: 2019-11-09 20:04:32

var
  n,m,q,i,t,w,cnt,x,y,z:longint;
  a,b,c,d:array[0..400001]of longint;
  f:array[0..100001]of longint;
  e:array[0..1000001]of longint;
begin
  readln(n,m,q);
  for i:=1 to m do
    begin
      readln(x,y,z);
      inc(cnt);a[cnt]:=y;b[cnt]:=c[x];c[x]:=cnt;d[cnt]:=z;
      inc(cnt);a[cnt]:=x;b[cnt]:=c[y];c[y]:=cnt;d[cnt]:=z;
    end;
  fillchar(f,sizeof(f),63);
  t:=1;w:=1;e[1]:=1;
  f[1]:=0;
  while t<=w do
    begin
      i:=c[e[t]];
      while i<>0 do
        begin
          if f[a[i]]>f[e[t]]+d[i] then
            begin
              inc(w);
              f[a[i]]:=f[e[t]]+d[i];
              e[w]:=a[i];
            end;
          i:=b[i];
        end;
      inc(t);
    end;
  for q:=1 to q do
    begin
      readln(x,y);
      writeln(f[x]+f[y]);
    end;
end.

C++ 解法, 执行用时: 45ms, 内存消耗: 4728K, 提交时间: 2022-05-18 20:01:21

#include <bits/stdc++.h>
using namespace std;
const int N = 50010;
const int INF = 0x3f3f3f3f;
int n, m, k;
vector <pair<int, int>>e[N];
int dis[N], vis[N];
void spfa() {
	memset(dis, INF, sizeof dis);
	dis[1] = 0;
	queue<int>q; q.push(1);
	while (!q.empty()) {
		int u = q.front(); q.pop();
		vis[u] = 0;
		for (auto& op : e[u]) {
			int v = op.first, w = op.second;
			if (dis[v] > dis[u] + w) {
				dis[v] = dis[u] + w;
				if (!vis[v]) {
					vis[v] = 1; q.push(v);
				}
			}
		}
	}
}
int main() {
	scanf("%d%d%d", &n, &m, &k);
	while (m--) {
		int a, b, c; scanf("%d%d%d", &a, &b, &c);
		e[a].push_back({ b,c });
		e[b].push_back({ a,c });
	}
	spfa();
	while (k--) {
		int a, b; scanf("%d%d", &a, &b);
		printf("%d\n", dis[a] + dis[b]);
	}

	return 0;
}

上一题