HDU5006 Resistance(高斯消元)
给你一个复杂的网路图,然后告诉你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(高斯消元)的更多相关文章
- [HDU3976]Electric resistance(电阻)(信竞&物竞)(高斯消元)
题面 Problem Description Now give you a circuit who has n nodes (marked from 1 to n) , please tell abc ...
- uva 10808 - Rational Resistors(基尔霍夫定律+高斯消元)
题目链接:uva 10808 - Rational Resistors 题目大意:给出一个博阿含n个节点,m条导线的电阻网络,求节点a和b之间的等效电阻. 解题思路:基尔霍夫定律,不论什么一点的电流向 ...
- 【BZOJ-3143】游走 高斯消元 + 概率期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2264 Solved: 987[Submit][Status] ...
- 【BZOJ-3270】博物馆 高斯消元 + 概率期望
3270: 博物馆 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 292 Solved: 158[Submit][Status][Discuss] ...
- *POJ 1222 高斯消元
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9612 Accepted: 62 ...
- [bzoj1013][JSOI2008][球形空间产生器sphere] (高斯消元)
Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧 ...
- hihoCoder 1196 高斯消元·二
Description 一个黑白网格,点一次会改变这个以及与其连通的其他方格的颜色,求最少点击次数使得所有全部变成黑色. Sol 高斯消元解异或方程组. 先建立一个方程组. \(x_i\) 表示这个点 ...
- BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基
[题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...
- SPOJ HIGH Highways ——Matrix-Tree定理 高斯消元
[题目分析] Matrix-Tree定理+高斯消元 求矩阵行列式的值,就可以得到生成树的个数. 至于证明,可以去看Vflea King(炸树狂魔)的博客 [代码] #include <cmath ...
随机推荐
- Codeforces Round #460 (Div. 2)-B. Perfect Number
B. Perfect Number time limit per test2 seconds memory limit per test256 megabytes Problem Descriptio ...
- 团体程序设计天梯赛-练习集 L2-001 紧急救援 (25 分)
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...
- Python 代码优化技巧(一)
Table of Contents 1. 代码优化Part1 1.1. if 判断的短路特性 1.2. join 合并字符串 1.3. while 1 和 while True 1.4. cProfi ...
- 洛谷P1424小鱼的航程改进版
题目链接https://www.luogu.org/problemnew/show/P1424
- mybatis是如何防止sql注入?
sql注入发生的时间,sql注入发生的阶段在sql预编译阶段,当编译完成的sql不会产生sql注入 采用jdbc操作数据时候 String sql = "update ft_proposal ...
- 静态文本框控件的美化CStatic
VC通用控件都是灰色,当对程序界面进行美化时,使用通用控件就和美化后的程序界面不搭配,在VB,C#中,可以很方便的更改控件背景颜色,但在VC中就不能,需要我们自己来完善这方面的功能.我在这只简单的介绍 ...
- linux环境搭建系列之tomcat安装步骤
前提: Linux centOS 64位 JDK 1.7 安装包从官网上下载 安装Tomcat之前要先安装JDK. 我的JDK是1.7版本的,所以Tomcat版本也选了7的 1.新建目录tomcat ...
- sql注入过滤了#,--+怎么办
题目是NCTF2018的web题目 第一段是错误的思路,第二段是晚上有思考后发现的直接看第二段吧. ① ?id=1'会直接出来报错提示. 猜测使用单引号保护id. 另外一打空格就提示you hacke ...
- Mac 因误使用chmod -R 777 命令更改 /usr/bin 造成终端不能实用,提醒进程已结束的完美解决方案!
1.不用删除任何文件. 2.启动root用户权限 4.在用root用户登进去 5.在root用户中使用终端输入命令 chown root:wheel /usr/bin/login chmod u+s ...
- 精通CSS高级Web标准解决方案(4、对链接应用样式)
4.1 简单的链接样式 锚可以作为内部引用,也可以作为外部链接,应该区分对待. 伪类选择器: :link 用来寻找没有访问过的链接 :visited 用来寻找已经访问过的链接 a:link{color ...