Live2D

Solution -「LOCAL」解析电车

\(\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……

posted @ 2020-09-01 20:25  Rainybunny  阅读(160)  评论(0)    收藏  举报