P2011计算电压题解
(Update:修改了乘号)
1道电学好题
前置知识:高斯消元
分析
观察样例:
对于一个
(流入的电流之和等于流出的电流之和)
因为:
(这里的
式子变成:
移项:
令
于是你惊喜地发现:不需要判断电流方向了!
但知道这个式子有什么用呢?
解决(代码)
由式子想到列方程(高斯消元),设每个点的电势为未知量,讯问时直接作差即可
变形:
所以如果节点
而对于以
核心代码(带注释):
for(register int i=1;i<=m;i++)
{
int u,v;db w;
u=read(),v=read(),w=read();
add(u,v,w),add(v,u,w);//建立电路图
}
//列方程(核心)
for(register int i=1;i<=n;i++)
{
if(st[i]) k[i][i]=1,k[i][n+1]=st[i];
//st[i]是正电极电势
//如果是正电极那么方程直接为 1*U[i]=st[i]
else
{
db sum=0;
for(int j=head[i];j;j=Edge[j].nxt)
{
int v=Edge[j].v;db w=Edge[j].w;
k[i][v]+=1.0/w;//注意可能两点间有多个电阻
sum+=1.0/w;
}
k[i][i]=-sum;//主元的系数
}
}
gouse();//自行添加
正确性:每个未知量都有主元的方程(即一共
时间复杂度:O(能过)
列方程 O(
制作不易,望管理员大大通过(这道题还没有较为详细的题解)
QwQ 完结撒花~~~