给你一个复杂的网路图,然后告诉你s,t,求s,t的等效电阻。方法是设s的电势为1,t的电势为0.然后对于其它的每个点x,满足的是sigma(ux-uy)/R(x,y)(即对每个与x相连的节点y,电势差除以电阻的和为0,应该是基尔霍夫定律什么的),然后就列出来了一堆方程,解出每个点的电势,对于源点连出去的所有边,求一下电流,知道总电流,而且也知道总电势,就可以知道电阻了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cassert>
#include <vector>
using namespace std; #define maxn 11000
#define eps 1e-7
struct Edge{
int u,v,c;
Edge(int ui,int vi,int ci):u(ui),v(vi),c(ci){}
Edge(){}
};
int dcmp(double x){
return (x>eps)-(x<-eps);
}
vector<Edge> E;
vector<int> G[maxn];
int n,m,s,t;
int bel[maxn];
int btot; void dfs(int u,int mark)
{
bel[u]=mark;
for(int i=0;i<G[u].size();++i){
int v=G[u][i];
if(bel[v]) continue;
else dfs(v,mark);
}
} void getBelong()
{
btot=0;
memset(bel,0,sizeof(bel));
for(int i=1;i<=n;++i){
if(!bel[i]){
++btot;
dfs(i,btot);
}
}
} int cnt[500][500];
double mat[500][500]; void gauss(int n)
{
for(int i=1;i<=n;++i){
int pivot=i;
for(int j=i;j<=n;++j){
if(abs(mat[j][i])>abs(mat[pivot][i])) pivot=j;
}
for(int x=1;x<=n+1;++x){
swap(mat[i][x],mat[pivot][x]);
}
if(abs(mat[i][i])<eps) continue;
for(int j=i+1;j<=n+1;++j){
mat[i][j]/=mat[i][i];
}
for(int j=1;j<=n;++j){
if(i!=j){
for(int k=i+1;k<=n+1;++k){
mat[j][k]-=mat[j][i]*mat[i][k];
}
}
}
}
} int main()
{
int T;cin>>T;
while(T--){
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=0;i<=n;++i) G[i].clear();
E.clear();
int ui,vi,ci;
for(int i=0;i<m;++i){
scanf("%d%d%d",&ui,&vi,&ci);
if(ci==0){
G[ui].push_back(vi);
G[vi].push_back(ui);
}
else{
E.push_back(Edge(ui,vi,ci));
}
}
getBelong();
if(bel[s]==bel[t]){
printf("%.6lf\n",0);continue;
}
memset(cnt,0,sizeof(cnt));
memset(mat,0,sizeof(mat));
for(int i=0;i<E.size();++i){
ui=E[i].u;vi=E[i].v;
if(bel[ui]!=bel[vi]){
cnt[bel[ui]][bel[vi]]++;
cnt[bel[vi]][bel[ui]]++;
}
}
for(int i=1;i<=btot;++i){
if(i==bel[s]){
mat[i][i]=1.0;
mat[i][btot+1]=1;
continue;
}
else if(i==bel[t]){
mat[i][i]=1.0;
mat[i][btot+1]=0;
continue;
}
for(int j=1;j<=btot;++j){
if(i==j||cnt[i][j]==0) continue;
mat[i][i]+=cnt[i][j];
mat[i][j]-=cnt[i][j];
}
}
gauss(btot);
double I=0;
for(int i=1;i<=btot;++i){
if(i==bel[s]) continue;
if(cnt[bel[s]][i]>0){
I+=(1-mat[i][btot+1])*cnt[bel[s]][i];
}
}
double R=1/I;
if(dcmp(I-eps)==0) {
printf("inf\n");
continue;
}
printf("%.6lf\n",R);
}
return 0;
}

HDU5006 Resistance(高斯消元)的更多相关文章

  1. [HDU3976]Electric resistance(电阻)(信竞&物竞)(高斯消元)

    题面 Problem Description Now give you a circuit who has n nodes (marked from 1 to n) , please tell abc ...

  2. uva 10808 - Rational Resistors(基尔霍夫定律+高斯消元)

    题目链接:uva 10808 - Rational Resistors 题目大意:给出一个博阿含n个节点,m条导线的电阻网络,求节点a和b之间的等效电阻. 解题思路:基尔霍夫定律,不论什么一点的电流向 ...

  3. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  4. 【BZOJ-3270】博物馆 高斯消元 + 概率期望

    3270: 博物馆 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 292  Solved: 158[Submit][Status][Discuss] ...

  5. *POJ 1222 高斯消元

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9612   Accepted: 62 ...

  6. [bzoj1013][JSOI2008][球形空间产生器sphere] (高斯消元)

    Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧 ...

  7. hihoCoder 1196 高斯消元·二

    Description 一个黑白网格,点一次会改变这个以及与其连通的其他方格的颜色,求最少点击次数使得所有全部变成黑色. Sol 高斯消元解异或方程组. 先建立一个方程组. \(x_i\) 表示这个点 ...

  8. BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

    [题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...

  9. SPOJ HIGH Highways ——Matrix-Tree定理 高斯消元

    [题目分析] Matrix-Tree定理+高斯消元 求矩阵行列式的值,就可以得到生成树的个数. 至于证明,可以去看Vflea King(炸树狂魔)的博客 [代码] #include <cmath ...

随机推荐

  1. day 63 Django基础九之中间件

    Django基础九之中间件   本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学 ...

  2. 初学python来进行odoo12版本开发

    这是我的第一篇博客.请多多指教! 首先要下载odoo-12的源代码 官方下载路径:          https://github.com/odoo/odoo/archive/12.0.zip 随便新 ...

  3. hihocoder 1097 最小生成树一·Prim算法

    #1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可 ...

  4. C语言中strtod()函数的用法详解

    函数原型: #include <stdlib.h> double strtod(const char *nptr, char **endptr); C语言及C++中的重要函数. 名称含义 ...

  5. 使用FileSystem类进行文件读写及查看文件信息

    使用FileSystem类进行文件读写及查看文件信息   在这一节我们要深入了解Hadoop的FileSystem类——这是与与hadoop的文件系统交互的重要接口.虽然我们只是着重于HDFS的实现, ...

  6. #include "*.c"文件的妙用

    在看uCOS II V2.91版本源代码时,在ucos_ii.c源文件中发现下面的代码: #include <os_core.c> #include <os_flag.c> # ...

  7. lua table长度解析

    先来看lua table源码长度获取部分(ltable.c) j是数组部分的长度.首先判断数组长度大于0,并且数组最后一个是nil,就用二分法查找,返回长度. 如果t->node是 table的 ...

  8. Maya材质

    mental ray--Indirect Lighting(物理学太阳天空)      Final Gathering最终聚集   改变质量为production的,FG就是关闭需要重新打开 平行光, ...

  9. 300万PV的ASP.NET网站使用阿里云的配置建议

    @老牛吃肉在博文“今天的访问高峰,扛过去了”的评论中询问了这样一个问题: 你好,站长,本公司正在考虑用阿里云.用途:互联网网站,主要站点:asp.net开发目前的考虑情况:访问ip 15-20万,pv ...

  10. Python框架之Django学习笔记(十七)

    Django框架之表单(续二) 今天的这篇博客将是Django学习笔记博客的最后一篇,基本每周最少一篇的Django框架学习,坚持到今天也实属不易,当然了,这个框架的学习仅仅是Django框架的基础部 ...