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 ...
随机推荐
- lnmp启用pathinfo并隐藏index.php
编辑如下区段: location ~ [^/]\.php(/|$) { # comment try_files $uri =404; to enable pathinfo try_files $uri ...
- 关于json数据中的多反斜杆转译--StringEscapeUtils.unescapeJava(踩过的坑)
一.需求 现有一个字符串str String str = "{\\\"name\\\":\\\"spy\\\",\\\"id\\\\&quo ...
- 免费证书Let’s Encrypt
我们自己也可以签发 SSL 安全证书,但是我们自己签发的安全证书不会被主流的浏览器信任,所以我们需要被信任的证书授权中心( CA )签发的安全证书.而一般的 SSL 安全证书签发服务都比较贵,比如 G ...
- A1025 PAT Ranking (25)(25 分)
A1025 PAT Ranking (25)(25 分) Programming Ability Test (PAT) is organized by the College of Computer ...
- 动态规划:最长上升子序列(二分算法 nlogn)
解题心得: 1.在数据量比较大的时候n^2会明显超时,所以可以使用nlogn 的算法,此算法少了双重循环,用的lower_bound(二分法). 2.lis中的数字并没有意义,仅仅是找到最小点lis[ ...
- CSS需要注意的问题1(转生活因拼搏而精彩的网易博客)
1.检查HTML元素(如:<ul>.<div>).属性(如:class=”")是否有拼写错误.是否忘记结束标记(如:<br />) 因为Xhtml 语 ...
- MySQL之Schema与数据类型优化
选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要.不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择: 更小的通常更好一般情况下,应该尽量使用 ...
- RDD算子、RDD依赖关系
RDD:弹性分布式数据集, 是分布式内存的一个抽象概念 RDD:1.一个分区的集合, 2.是计算每个分区的函数 , 3.RDD之间有依赖关系 4.一个对于key-value的RDD的Partit ...
- hadoop完全分布式集群的搭建
集群配置: jdk1.8.0_161 hadoop-2.6.1 linux系统环境:Centos6.5 创建普通用户 dummy 准备三台虚拟机master,slave01,slave02 hado ...
- Oracle 学习笔记(十)
合并查询 在实际项目开发中经常遇到要合并结果集的情况,可以使用集合操作符:union,union all,intersect,minus.这次笔记学习这几个操作符. [union] 该操作符用于取得两 ...