程序员必知:uva10808

简介: 程序员必知:uva10808

题目链接:uva 10808 - Rational Resistors

题目大意:给出一个博阿含n个节点,m条导线的电阻网络,求节点a和b之间的等效电阻。

解题思路:基尔霍夫定律,不论什么一点的电流向量为0。就是说有多少电流流入该节点。就有多少电流流出。

对于每次询问的两点间等效电阻。先推断说两点是否联通。不连通的话绝逼是1/0(无穷大)。联通的话,将同一个联通分量上的节点都扣出来,如果电势作为变元,然后依据基尔霍夫定律列出方程,由于对于每一个节点的电流向量为0。所以每一个节点都有一个方程,全部与该节点直接连接的都会有电流流入。而且最后总和为0,(除了a,b两点,一个为1,一个为-1)。用高斯消元处理,可是这样列出的方程组不能准确求出节点的电势,仅仅能求出各个节点之间电势的关系。所以我们将a点的电势置为0,那么用求出的b点电势减去0就是两点间的电压,又由于电流设为1,所以等效电阻就是电压除以电流。

#include

#include

#include

using namespace std;

typedef long long type;

struct Fraction {

type member; // 分子;

type denominator; // 分母;

Fraction (type member = 0, type denominator = 1);

void operator = (type x) { this->set(x, 1); }

Fraction operator (const Fraction u);

Fraction operator / (const Fraction u);

Fraction operator + (const Fraction u);

Fraction operator - (const Fraction u);

Fraction operator = (const Fraction u) { return this = this u; }

Fraction operator /= (const Fraction u) { return this = this / u; }

Fraction operator += (const Fraction u) { return this = this + u; }

Fraction operator -= (const Fraction u) { return this = this - u; }

void set(type member, type denominator);

};

inline type gcd (type a, type b) {

return b == 0 ?

(a > 0 ? a : -a) : gcd(b, a % b);

}

inline type lcm (type a, type b) {

return a / gcd(a, b) b;

}

/Code/

/////////////////////////////////////////////////////

const int maxn = 105;

typedef long long ll;

typedef Fraction Mat【maxn】【maxn】;

int N, M, f【maxn】;

Mat G, A;

bool cmp (Fraction a, Fraction b) {

return a.member b.denominator < b.member a.denominator;

}

inline int getfar (int x) {

return x == f【x】 ? x : f【x】 = getfar(f【x】);

}

inline void link (int u, int v) {

int p = getfar(u);

int q = getfar(v);

f【p】 = q;

}

void init () {

scanf("%d%d", N, M);

for (int i = 0; i < N; i++) {

f【i】 = i;

for (int j = 0; j < N; j++)

G【i】【j】 = 0;

}

int u, v;

ll R;

for (int i = 0; i < M; i++) {

scanf("%d%d%lld", u, v, R);

if (u == v)

continue;

link(u, v);

G【u】【v】 += Fraction(1, R);

G【v】【u】 += Fraction(1, R);

}

}

Fraction gauss_elimin (int u, int v, int n) {

/

printf("\n");

for (int i = 0; i < n; i++) {

for (int j = 0; j <= n; j++)

printf("%lld/%lld ", A【i】【j】.member, A【i】【j】.denominator);

printf("\n");

}

/

for (int i = 0; i < n; i++) {

int r;

for (int j = i; j < n; j++)

if (A【j】【i】.member) {

r = j;

break;

}

if (r != i) {

for (int j = 0; j <= n; j++)

swap(A【i】【j】, A【r】【j】);

}

if (A【i】【i】.member == 0)

continue;

for (int j = i + 1; j < n; j++) {

Fraction t = A【j】【i】 / A【i】【i】;

for (int k = 0; k = 0; i--) {

for (int j = i+1; j < n; j++) {

if (A【j】【j】.member)

A【i】【n】 -= A【i】【j】 A【j】【n】 / A【j】【j】;

}//代码效果参考:http://www.ezhiqi.com/zx/art_5736.html

}

/

Fraction U = A【u】【n】 / A【u】【u】;

printf("%lld/%lld!\n", A【u】【n】.member, A【u】【n】.denominator);

printf("%lld/%lld!\n", A【u】【u】.member, A【u】【u】.denominator);

printf("%lld/%lld\n", U.member, U.denominator);

Fraction V = A【v】【n】 / A【v】【v】;

printf("%lld/%lld\n", V.member, V.denominator);

/

return A【u】【n】 / A【u】【u】 - A【v】【n】 / A【v】【v】;

}

Fraction solve (int u, int v) {

int n = 0, hash【maxn】;

int hu, hv;

for (int i = 0; i < N; i++) {

if (i == u)

hu = u;

if (i == v)

hv = v;

if (getfar(i) == getfar(u))

hash【n++】 = i;

}

n++;

for (int i = 0; i <= n; i++) {

for (int j = 0; j <= n; j++)

A【i】【j】 = 0;

}

for (int i = 0; i < n - 1; i++) {

for (int j = 0; j < n - 1; j++) {

if (i == j)

continue;

int p = hash【i】;

int q = hash【j】;

A【i】【i】 += G【p】【q】;

A【i】【j】 -= G【p】【q】;

}

}

A【hu】【n】 = 1;

A【hv】【n】 = -1;

A【n-1】【0】 = 1;

return gauss_elimin (hu, hv, n);

}

int main () {

int cas;

scanf("%d", cas);

for (int kcas = 1; kcas <= cas; kcas++) {

init();

int Q, u, v;

scanf("%d", Q);

printf("Case #%d:\n", kcas);

for (int i = 0; i < Q; i++) {

scanf("%d%d", u, v);

printf("Resistance between %d and %d is ", u, v);

if (getfar(u) == getfar(v)) {

Fraction ans = solve(u, v);

printf("%lld/%lld\n", ans.member, ans.denominator);

} else

printf("1/0\n");

}

printf("\n");

}

return 0;

}

/////////////////////////////////////////////////////

Fraction::Fraction (type member, type denominator) {

this->set(member, denominator);

}

Fraction Fraction::operator (const Fraction u) {

type tmp_p = gcd(member, u.denominator);

type tmp_q = gcd(u.member, denominator);

return Fraction( (member / tmp_p) (u.member / tmp_q), (denominator / tmp_q) (u.denominator / tmp_p) );

}

Fraction Fraction::operator / (const Fraction u) {

type tmp_p = gcd(member, u.member);

type tmp_q = gcd(denominator, u.denominator);

return Fraction( (member / tmp_p) (u.denominator / tmp_q), (denominator / tmp_q) (u.member / tmp_p));

}

Fraction Fraction::operator + (const Fraction u) {

type tmp_l = lcm (denominator, u.denominator);

return Fraction(tmp_l / denominator member + tmp_l / u.denominator u.member, tmp_l);

}

Fraction Fraction::operator - (const Fraction u) {

type tmp_l = lcm (denominator, u.denominator);

return Fraction(tmp_l / denominator member - tmp_l / u.denominator u.member, tmp_l);

}

void Fraction::set (type member, type denominator) {

if (denominator == 0) {

denominator = 1;

member = 0;

}

if (denominator < 0) {

denominator = -denominator;

member = -member;

}

type tmp_d = gcd(member, denominator);

this->member = member / tmp_d;

this->denominator = denominator / tmp_d;

}

相关文章
|
负载均衡 Cloud Native 数据库
构建高可用的云原生微服务架构:实现弹性和可扩展性
随着云计算技术的快速发展,云原生微服务架构成为了现代应用开发领域中的一种重要范式。它通过利用云服务提供的弹性和可扩展性,为企业构建高可用的、面向未来的应用程序。本文将探讨云原生微服务的概念、核心原则以及一些关键技术,帮助您设计和构建具有弹性和可伸缩性的架构。
1407 1
|
机器学习/深度学习 数据可视化 测试技术
YOLO11实战:新颖的多尺度卷积注意力(MSCA)加在网络不同位置的涨点情况 | 创新点如何在自己数据集上高效涨点,解决不涨点掉点等问题
本文探讨了创新点在自定义数据集上表现不稳定的问题,分析了不同数据集和网络位置对创新效果的影响。通过在YOLO11的不同位置引入MSCAAttention模块,展示了三种不同的改进方案及其效果。实验结果显示,改进方案在mAP50指标上分别提升了至0.788、0.792和0.775。建议多尝试不同配置,找到最适合特定数据集的解决方案。
2973 0
|
机器学习/深度学习 人工智能 大数据
人工智能:从梦想到现实
20世纪初,计算机科学先驱艾伦·图灵提出“图灵测试”,探讨机器是否能展现与人类无异的智能行为,激发了人工智能(AI)的无限想象。1956年的达特茅斯会议标志着AI研究的开端,历经起伏,至80年代专家系统与机器学习的出现推动了AI进入新阶段。21世纪以来,大数据、云计算及深度学习等技术的飞速发展使AI应用广泛,从智能家居到医疗诊断等多个领域发挥重要作用。尽管如此,AI的发展亦伴随着隐私保护、就业及伦理等社会议题,需相关政策引导以确保其健康发展。
我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
961 0
|
9天前
|
机器人 API 调度
基于 DMS Dify+Notebook+Airflow 实现 Agent 的一站式开发
本文提出“DMS Dify + Notebook + Airflow”三位一体架构,解决 Dify 在代码执行与定时调度上的局限。通过 Notebook 扩展 Python 环境,Airflow实现任务调度,构建可扩展、可运维的企业级智能 Agent 系统,提升大模型应用的工程化能力。
|
人工智能 前端开发 API
前端接入通义千问(Qwen)API:5 分钟实现你的 AI 问答助手
本文介绍如何在5分钟内通过前端接入通义千问(Qwen)API,快速打造一个AI问答助手。涵盖API配置、界面设计、流式响应、历史管理、错误重试等核心功能,并提供安全与性能优化建议,助你轻松集成智能对话能力到前端应用中。
676 154