Solution -「LOCAL」解析电车
给定 个点 条边的无向图,每条边形如 ,表示 之间有一条阻值为 的电阻。求 到 的等效电阻。
,。
-
欧姆定律:通过一段电路 两端的电流为 。
-
基尔霍夫电流定律:设流入电流为正,流出电流为负,则任意节点有 。
其中 表示电势(本题中可以粗暴地理解作“高度”,想象成水流从高往低流)。对兔子这种初中电学还没学完的蒟蒻极不友好。
钦定 输出 的电流,对于每个点,结合上两条定律,有:
但发现如果有解,那么每个 加上同一常数仍是一组解,所以断定存在一个式子与其它 个线性相关。随便去掉一个式子,再钦定 ,就能解出 的电势 。由于 ,所以 的数值就是等效电阻的数值。
#include <cstdio>
#include <iostream>
const int MAXN = 100;
const double EPS = 1e-9;
int n, m, S, T;
double coe[MAXN + 5][MAXN + 5], I[MAXN + 5], U[MAXN + 5];
inline double abs_ ( const double x ) { return x < 0 ? -x : x; }
inline void Gauss ( double A[MAXN + 5][MAXN + 5], double* B, double* X ) {
for ( int i = 1; i <= n; ++ i ) {
int p = i;
for ( int j = i + 1; j <= n; ++ j ) {
if ( abs_ ( A[j][i] ) > abs_ ( A[p][i] ) ) {
p = j;
}
}
if ( i ^ p ) std::swap ( A[i], A[p] ), std::swap ( B[i], B[p] );
for ( int j = i + 1; j <= n; ++ j ) {
double d = A[j][i] / A[i][i];
for ( int k = i; k <= n; ++ k ) A[j][k] -= d * A[i][k];
B[j] -= d * B[i];
}
}
for ( int i = n; i; -- i ) {
X[i] = B[i] / A[i][i];
for ( int j = i - 1; j; -- j ) B[j] -= A[j][i] * X[i];
}
}
int main () {
freopen ( "electric.in", "r", stdin );
freopen ( "electric.out", "w", stdout );
scanf ( "%d %d %d %d", &n, &m, &S, &T );
for ( int i = 1; i < n; ++ i ) I[i] = ( i == S ) - ( i == T );
for ( int i = 1, u, v, t; i <= m; ++ i ) {
scanf ( "%d %d %d", &u, &v, &t );
double r = 1.0 / t;
if ( u < n ) coe[u][u] += r, coe[u][v] -= r;
if ( v < n ) coe[v][v] += r, coe[v][u] -= r;
}
coe[n][T] = 1;
Gauss ( coe, I, U );
printf ( "%.2f\n", U[S] );
return 0;
}
高消记得换系数行的时候顺便换值啊……这种错查了快 qwq……
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现