DoveCLL and Resistance(湖北省赛)

题目

构造一个由串联和并联构成的纯电阻电路,使得该电路的等效电阻为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

原文地址:https://www.cnblogs.com/lfri/p/9783040.html