POJ 3532 Resistance 高斯消元
2014-11-21 10:56
155 查看
题意:有N个节点,M个电阻,告诉每个电阻所连的节点。求节点1和节点N之间的等效电阻。
思路:高斯消元+节点电压法。带入电阻就行了。
注意:需要设出一个参考节点,即电势为0.
代码如下:
思路:高斯消元+节点电压法。带入电阻就行了。
注意:需要设出一个参考节点,即电势为0.
代码如下:
#include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; int N,M,u,v; const int MAX = 1000; const double EPS = 1e-6; double a[MAX][MAX]; //a is a matrix , l is represent free variable, ans store the answer double gauss() { int n = N; for (int i = 0; i < n; i++) { int r; for (r = i; r < n; r++) if (fabs(a[r][i]) >= EPS) break; if (r == n) continue; for (int j = 0; j <= n; j++) swap(a[i][j], a[r][j]); for (int j = n; j > i; j--) a[i][j] /= a[i][i]; a[i][i] = 1.0; for (int j = 0; j < n; j++) { if (i == j) continue; if (fabs(a[j][i]) >= EPS) { for (int k = n; k > i; k--) a[j][k] -= a[j][i] * a[i][k]; a[j][i] = 0.0; } } } return a[0] / a[0][0]; } int main(void) { //freopen("input.txt","r",stdin); double r; scanf("%d%d",&N,&M); for(int i = 0; i < M; ++i){ scanf("%d%d%lf",&u,&v,&r); --u,--v; double s = 1.0 / r; a[u][u] += s; a[v][v] += s; a[u][v] -= s; a[v][u] -= s; } N++; a[0] = 1.0; a[N-2] = -1.0; a[N-1][N-2] = 1; printf("%.2f\n",gauss()); return 0; }
相关文章推荐
- POJ 3532 Resistance(高斯消元+基尔霍夫定理)
- POJ 1222 & 1681 & 1830 & 3185 开关灯问题 (高斯消元 & 异或方程组)
- POJ 1830 高斯消元
- POJ 1487:Single-Player Games 浮点数高斯消元
- POJ 1681 Painter's Problem (高斯消元)
- POJ 1222 高斯消元
- poj 1830 开关问题(高斯消元)
- poj 1681 高斯消元(方形涂色)
- 【高斯消元】Poj 1222:EXTENDED LIGHTS OUT
- poj 1830 高斯消元
- poj 1681 Painter's Problem(高斯消元)
- poj2065--SETI(高斯消元)
- poj 1753 Flip Game(高斯消元 开关问题)
- Painter's Problem POJ - 1681 高斯消元+枚举自由元
- poj 1753 Flip Game(高斯消元)
- poj 2065 SETI 高斯消元解模线性方程
- POJ 1830 【高斯消元第一题】
- poj 1681 Painter's Problem 【高斯消元 + 状压枚举自由变元】
- poj 2065 SETI (高斯消元)
- 【高斯消元】poj 1222