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 ...
随机推荐
- Ecshop之ajax修改表里的状态(函数化处理)
目录 功能: 效果: 思路: 页面里 控制器里 功能: `点击图片,修改表里的状态值` 效果: 思路: 页面里在img里点绑定onclick件事,调用js函数listTable.toggle oncl ...
- (转)Xcode6中自动布局autolayout和sizeclass的使用
Xcode6中自动布局autolayout和sizeclass的使用 一.关于自动布局(Autolayout) 在Xcode中,自动布局看似是一个很复杂的系统,在真正使用它之前,我也是这么认为的, ...
- hive实现根据用户分组,按用户记录求上下两条记录的时间差
在mysql,数据如下:#查询某一用户该日抽奖时间 select draw_time from user_draw_log where user_id = 1 and draw_date='2016- ...
- 10,Scrapy简单入门及实例讲解
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...
- xposed的基本使用
一.原理 Android运行的核心是zygote进程,所有app的进程都是通过zygote fork出来的.通过替换system/bin/下面的app_process等文件,相当于替换了zygote进 ...
- Vue+Django REST framework打造生鲜电商项目
1-1 课程导学 2-1 Pycharm的安装和简单使用 2-2 MySQL和Navicat的安装和使用 2-3 Windows和Linux下安装Python2和Python3 2-4 虚拟环境的安装 ...
- Python 操作 PostgreSQL 数据库
我使用的是 Python 3.7.0 PostgreSQL可以使用psycopg2模块与Python集成. sycopg2是用于Python编程语言的PostgreSQL数据库适配器. psycopg ...
- Java的移位运算符
1.左移运算符:<< 丢弃左边指定位数,右边补0. 注意: 当int类型进行左移操作时,左移位数大于等于32位操作时,会先求余(%)后再进行左移操作.也就是说左移32位相当于不进行移位操作 ...
- 【Luogu】P4067储能表(数位DP)
题目链接 好的 看到这题之后我一直在想反演,然后想不出来,一度以为自己脑子有问题 然后我脑子真的有问题,这题tm根本就不是反演 设f[i][j][k][l]表示现在已经DP到从高位往低数的第i位,有没 ...
- AGC 26 D Histogram Coloring
题目 将柱子的高度离散化$\DeclareMathOperator{\dp}{dp}$ 设第 $i$ 根柱子实际高度是 $h_i$,离散化之后的高度是 $g_i$:第 $i$ 高的高度是 $H_i$, ...