题目
构造一个由串联和并联构成的纯电阻电路,使得该电路的等效电阻为p/q,其中(p,q) = 1。要求输出n,表示节点数,m表示电阻个数,m行每行ui,vi,wi,表示ui和vi之间要连上一个电阻为wi,然后输出s,t表示接入节点和接出节点。
原题链接:https://www.nowcoder.com/acm/contest/104/D
思路
p/q = r + t/q,首先串联一个rΩ电阻,由并联电路电阻公式1/R = 1/R1 + 1/R2+...1/Rn,所以q/t = r2 + t2/q,其中r2可以用r2个1Ω电阻组成,如果t2不为0,重复上一步骤,这个可以递归完成。直到r为0或1,返回。
代码实现
1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 5 struct node 6 { 7 int u, v; 8 int w; 9 node(){} 10 node(int nu,int nv,int nw):u(nu),v(nv),w(nw){} 11 }ans[1000 + 10]; 12 int p, q; 13 int numr; //电阻个数 14 int head,tail; 15 16 17 inline void dfs(int x,int y,int l,int r) 18 { 19 if (x > y) 20 { 21 ans[numr++] = node(l, ++tail, x / y); 22 x %= y; 23 dfs(x, y, tail, r); 24 } 25 else 26 { 27 tail++; 28 if (tail != r) ans[numr++] = node(tail, r, 0); 29 for (int i = 0; i < y / x; i++) ans[numr++] = node(l, tail, 1); 30 y %= x; 31 if (y == 0) return; 32 if (y == 1) 33 { 34 ans[numr++] = node(l, tail, x); 35 return; 36 } 37 dfs(x, y, l, tail); 38 } 39 } 40 41 int main() 42 { 43 while (scanf("%d%d",&p,&q) == 2) 44 { 45 numr = 0; 46 head = tail = 1; 47 if (p >= q) 48 { 49 ans[numr++] = node(1, 2, p / q); 50 p %= q; 51 head++; 52 tail++; 53 } 54 dfs(p, q, head, head + 1); 55 printf("%d %d ", tail, numr); 56 for (int i = 0; i < numr; i++) 57 printf("%d %d %d ", ans[i].u, ans[i].v, ans[i].w); 58 printf("1 %d ", head + 1); 59 } 60 61 return 0; 62 }
参考链接:https://www.nowcoder.com/acm/contest/view-submission?submissionId=25692511