P2011计算电压 高斯消元57分求救
  • 板块题目总版
  • 楼主zhongxicheng
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/10 10:50
  • 上次更新2025/1/10 10:53:39
查看原帖
P2011计算电压 高斯消元57分求救
892461
zhongxicheng楼主2025/1/10 10:50
#include <bits/stdc++.h>
using namespace std;

#define val double
const int N = 203;
int n,m,k,q;
const val eps = 1e-12;

bool ele[N];
val R[N][N], U[N], a[N][N];

int main() {
	
	register int i, j, u;
	scanf("%d%d%d%d",&n,&m,&k,&q);
	ele[0] = true;
	for(i=1;i<=k;i++)
		scanf("%d%d",&j,&u),
		ele[j] = true, U[j] = u;
	while(m--)
		scanf("%d%d%d",&i,&j,&u),
		R[i][j] += 1.0/u, R[j][i] += 1.0/u;
	for(i=0;i<=n;i++)
		if(ele[i]) a[i][i] = 1, a[i][n+1] = U[i];
		else
			for(j = 0;j<=n;j++)
				a[i][i] += R[i][j], a[i][j] -= R[i][j];
	//高斯消元 
	for(i=0;i<=n;i++) {
		int mx = 0;
		for(j=1;j<=n;j++)
			if( fabs(a[j][i]) > fabs(a[mx][i]) ) mx = j; 
		for(j=0;j<=n+1;j++) swap(a[i][j],a[mx][j]);
		for(j=n+1;j>i;j--) a[i][j]/=a[i][i];
		a[i][i] = 1;
		
		for(j=0;j<=n;j++) {
			if(j!=i && fabs(a[j][i])>eps)
				for(u = i+1;u<=n+1;u++)
					a[j][u] -= a[i][u]*a[j][i];
			if(j!=i)
				a[j][i] = 0;
		}
	}
	while(q--) {
		scanf("%d%d",&i,&j);
		val res = a[i][n+1] - a[j][n+1];
		if(fabs(res)<eps) printf("0.00\n");
		else printf("%.2lf\n",res);
	}
	
	return 0;
}
2025/1/10 10:50
加载中...