hdu 3976 Electric resistance 高斯消元(浮点满秩模板)

xiaoxiao2021-02-28  132

题意:给定n个结点,编号为1~n。m个电阻连在不同结点间,求1~n的等效电阻。

思路:根据基尔霍夫定律,流入或流出某一节点的所有之路的电流代数和为0。对每个节点列一个方程。未知量为各点的电势。假设流入1点的电流为1,那么流出n点的电流也为1.设1点电势为0,解出来的n点的电势即答案。

http://acm.hdu.edu.cn/showproblem.php?pid=3976

#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int maxn = 60; const double eps = 1e-9; double a[maxn][maxn]; double x[maxn]; void print(int n=4) { for(int i=0;i<n;i++) { for(int j=0;j<=n;j++) printf("%lf ",a[i][j]); printf("\n"); } printf("\n"); } int Gauss(int equ,int var) { int row=0,col=0; for(;row<equ&&col<var;row++,col++) { int maxrow=row; for(int i=row+1;i<equ;i++) if(fabs(a[i][col])>fabs(a[maxrow][col])) maxrow=i; if(maxrow!=row) { for(int i=col;i<=var;i++) swap(a[maxrow][i],a[row][i]); } for(int i=row+1;i<equ;i++) { if(a[i][col]) { double temp = -(a[i][col]/a[row][col]); for(int j=col;j<=var;j++) { a[i][j] += temp*a[row][j]; } } } // print(); } for(int i=equ-1;i>=0;i--) { double temp = a[i][var]; for(int j=i+1;j<var;j++) { temp = temp-a[i][j]*x[j]; } x[i]=temp/a[i][i]; } return 0; } int main() { int t,cas=1; // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); scanf("%d",&t); while(t--) { int n,m,u,v; double r; scanf("%d%d",&n,&m); memset(a,0,sizeof(a)); for(int i=0;i<m;i++) { scanf("%d%d%lf",&u,&v,&r); a[u-1][u-1]-=1.0/r; a[u-1][v-1]+=1.0/r; a[v-1][u-1]+=1.0/r; a[v-1][v-1]-=1.0/r; } for(int i=0;i<n;i++) { a[i][0]=0; x[i]=0; } a[0][n]=1; a[n-1][n]=-1; // print(n); Gauss(n,n); printf("Case #%d: %.2lf\n",cas++,x[n-1]); } }

转载请注明原文地址: https://www.6miu.com/read-27326.html

最新回复(0)