\(\mathcal{Description}\)

  给定 \(n\) 个点 \(m\) 条边的无向图,每条边形如 \((u,v,r)\),表示 \(u,v\) 之间有一条阻值为 \(r\Omega\) 的电阻。求 \(S\) 到 \(T\) 的等效电阻。

  \(n\le100\),\(m\le\frac{n(n-1)}2\)。

\(\mathcal{Solution}\)

  • 欧姆定律:通过一段电路 \(AB\) 两端的电流为 \(\frac{\varphi_A-\varphi_B}{R_{AB}}\)。

  • 基尔霍夫电流定律:设流入电流为正,流出电流为负,则任意节点有 \(\sum I=0\)。

  其中 \(\varphi\) 表示电势(本题中可以粗暴地理解作“高度”,想象成水流从高往低流)。对兔子这种初中电学还没学完的蒟蒻极不友好。

  钦定 \(S\) 输出 \(1A\) 的电流,对于每个点,结合上两条定律,有:

\[\sum_{(u,v)\in E}\frac{\varphi_u-\varphi_v}{R_{uv}}=([u=S]-[u-T])A
\]

  但发现如果有解,那么每个 \(\varphi\) 加上同一常数仍是一组解,所以断定存在一个式子与其它 \(n-1\) 个线性相关。随便去掉一个式子,再钦定 \(\varphi_T=0\),就能解出 \(S\) 的电势 \(\varphi_S\)。由于 \(I=\frac{U}R=1A\),所以 \(\varphi_S\) 的数值就是等效电阻的数值。

\(\mathcal{Code}\)

#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;
}

\(\mathcal{Details}\)

  高消记得换系数行的时候顺便换值啊……这种错查了快 \(2min\) qwq……

Solution -「LOCAL」解析电车的更多相关文章

  1. Solution -「LOCAL」二进制的世界

    \(\mathcal{Description}\)   OurOJ.   给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{ ...

  2. Solution -「LOCAL」大括号树

    \(\mathcal{Description}\)   OurTeam & OurOJ.   给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) ...

  3. Solution -「LOCAL」过河

    \(\mathcal{Description}\)   一段坐标轴 \([0,L]\),从 \(0\) 出发,每次可以 \(+a\) 或 \(-b\),但不能越出 \([0,L]\).求可达的整点数. ...

  4. Solution -「LOCAL」Drainage System

    \(\mathcal{Description}\)   合并果子,初始果子的权值在 \(1\sim n\) 之间,权值为 \(i\) 的有 \(a_i\) 个.每次可以挑 \(x\in[L,R]\) ...

  5. Solution -「LOCAL」Burning Flowers

      灼之花好评,条条生日快乐(假装现在 8.15)! \(\mathcal{Description}\)   给定一棵以 \(1\) 为根的树,第 \(i\) 个结点有颜色 \(c_i\) 和光亮值 ...

  6. Solution -「LOCAL」画画图

    \(\mathcal{Description}\)   OurTeam.   给定一棵 \(n\) 个点的树形随机的带边权树,求所有含奇数条边的路径中位数之和.树形生成方式为随机取不连通两点连边直到全 ...

  7. Solution -「LOCAL」ZB 平衡树

    \(\mathcal{Description}\)   OurOJ.   维护一列二元组 \((a,b)\),给定初始 \(n\) 个元素,接下来 \(m\) 次操作: 在某个位置插入一个二元组: 翻 ...

  8. Solution -「LOCAL」舟游

    \(\mathcal{Description}\)   \(n\) 中卡牌,每种三张.对于一次 \(m\) 连抽,前 \(m-1\) 次抽到第 \(i\) 种的概率是 \(p_i\),第 \(m\) ...

  9. Solution -「LOCAL」充电

    \(\mathcal{Description}\)   给定 \(n,m,p\),求序列 \(\{a_n\}\) 的数量,满足 \((\forall i\in[1,n])(a_i\in[1,m])\l ...

随机推荐

  1. SQL Server数据库出现“无法访问数据库XXX(objectExplorer)”的解决办法

    数据库版本为2008R2,服务器异常重启并重新挂载iscsi后,数据库出现"无法访问数据库XXX(objectExplorer)"问题. 输入SQL命令查看数据库状态 1 sele ...

  2. angularJS中$digest already in progress报错解决方法

    看到一个前端群里有人问,就查了下解决"$digest already in progress"最好的方式,就是不要使用$scope.$apply()或者$scope.$digest ...

  3. vue实现PC端分辨率适配

    lib-flexible + px2rem Loader lib-flexible 阿里伸缩布局方案 px2rem-loader:px转rem: 依赖 首先需要安装 vue-cli 脚手架,这里我安装 ...

  4. 【爬虫】从零开始使用 Scrapy

    一. 概述 最近有一个爬虫相关的需求,需要使用 scrapy 框架来爬取数据,所以学习了一下这个非常强大的爬虫框架,这里将自己的学习过程记录下来,希望对有同样需求的小伙伴提供一些帮助. 本文主要从下面 ...

  5. Genymotion安装apk问题

    Genymotion安装apk时,出现如下错误: 问题原因分析:很多apk使用arm架构的 cpu,在x86上安装会存在问题. 解决办法: 在Genymotion模拟器上安装一个能够解析ARM架构的a ...

  6. conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

    conda : 无法将"conda"项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次. 解决办法: 没有添加系 ...

  7. C# 计算三角形和长方形 周长面积

    编写一个控制台应用程序,输入三角形或者长方形边长,计算其周长和面积并输出. 代码如下: using System; using System.Collections.Generic; using Sy ...

  8. 【记录一个问题】铁威马NAS,升级系统后,所有安装的配置项都丢失了

    因为铁威马的系统功能真的是弱,所以写了一些家庭照片处理的系统. 上上周升级了系统后,丢失了以下内容: anaconda 2.及其conda下python3环境的各种库 3.nginx的转发配置 铁威马 ...

  9. ServletContext类介绍(对象的作用及演示、像map一样存取数据)

    什么是ServletContext类 1,什么是 ServletContext 1)ServletContext 是一个接口,它表示Servlet上下文对象 2)一个web工程,只有一个Servlet ...

  10. 如何通俗地理解docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...