T1. 最短路径问题
平面上有 n n n 个点( n ≤ 100 n\le 100 n≤100),每个点的坐标均在 − 10000 ∼ 10000 -10000\sim 10000 −10000∼10000 之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。
时间限制:1 s
内存限制:128 MB
- 输入
共 n + m + 3 n+m+3 n+m+3 行,第一行为整数 n n n。
第 2 2 2 行到第 n + 1 n+1 n+1 行(共 n n n 行) ,每行两个整数 x x x 和 y y y,描述了一个点的坐标。
第 n + 2 n+2 n+2 行为一个整数 m m m,表示图中连线的个数。
此后的 m m m 行,每行描述一条连线,由两个整数 i i i 和 j j j 组成,表示第 i i i 个点和第 j j j 个点之间有连线。
最后一行两个整数 s s s 和 t t t,分别表示源点和目标点。 - 输出
仅一行,一个实数(保留两位小数),表示从 s s s 到 t t t 的最短路径长度。 - 样例输入
5 0 0 2 0 2 2 0 2 3 1 5 1 2 1 3 1 4 2 5 3 5 1 5
- 样例输出
3.41
思路分析
此题考查最短路径问题,属于模板题。常规情况下,最好选用 D i j k s t r a \tt Dijkstra Dijkstra 算法进行求解,不过此题数据量较小,可以使用代码更为简单的 F l o y d \tt Floyd Floyd 算法求解。
/*
* Name: T1.cpp
* Problem: 最短路径问题
* Author: Teacher Gao.
* Date&Time: 2025/07/18 15:25
*/
#include <iostream>
#include <cmath>
using namespace std;
int x[105], y[105];
double g[105][105];
double dis(int u, int v) {
return sqrt((x[u] - x[v]) * (x[u] - x[v]) + (y[u] - y[v]) * (y[u] - y[v]));
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n, m, u, v;
fill(g[0], g[0] + 105 * 105, 1e9);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> x[i] >> y[i];
g[i][i] = 0;
}
cin >> m;
for (int i = 1; i <= m; i++) {
cin >> u >> v;
g[u][v] = g[v][u] = dis(u, v);
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (g[i][j] > g[i][k] + g[k][j])
g[i][j] = g[i][k] + g[k][j];
cin >> u >> v;
printf("%.2lf", g[u][v]);
return 0;
}
T2. 控制公司
有些公司是其他公司的部分拥有者,因为他们获得了其他公司发行的股票的一部分。例如,福特公司拥有马自达公司 12 % 12\% 12% 的股票。据说,如果至少满足了以下条件之一,公司 A 就可以控制公司 B 了:
- 公司 A = = = 公司 B。
- 公司 A 拥有大于 50 % 50\% 50% 的公司 B 的股票。
- 公司 A 控制 K ( K ≥ 1 ) K\ (K \ge 1) K (K≥1) 个公司,记为 C 1 , . . , C K C_1, .., C_K C1,..,CK,每个公司 C i C_i Ci 拥有 x i % x_i\% xi% 的公司 B 的股票,并且 x 1 + . . + x K > 50 % x_1 + .. + x_K > 50\% x1+..+xK>50%。(PS:A 可以控制自己,即 C i C_i Ci 可以为 A)。
你将被给予一系列的三对数 ( i , j , p ) (i,j,p) (i,j,p),表明公司 i i i 拥有公司 j j j 的 p % p\% p% 的股票。计算所有的数对 ( h , s ) (h,s) (h,s),表明公司 h h h 控制公司 s s s。
时间限制:1 s
内存限制:64 MB
- 输入
第一行: N N N,表明接下来三对数的数量。
第二行到第 N + 1 N+1 N+1 行:每行三个整数作为一个三对数 ( i , j , p ) (i,j,p) (i,j,p),如题目所述。 N , i , j , p ≤ 100 N,i,j,p≤100 N,i,j,p