poj3532

原创 2015年07月07日 11:36:43

算电阻

题目描述:

1和n之间的电阻.给出了节点之间导线以及电阻值.

题解:

高斯消元.之前先用电压法构造.统一标号减1.u0定为0,un-1待定.然后定u0到un-1的电流为1,算到方程组里.之后u0的方程组=0,然后每次电阻都写到方程组里,那么un-1算出来其实就是电阻值.

重点:

电位法,并且假设电流,转换方程.

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <ctype.h>
#include <limits.h>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <set>
#include <bitset>
#define CLR(a) memset(a, 0, sizeof(a))
#define REP(i, a, b) for(int i = a;i < b;i++)
#define REP_D(i, a, b) for(int i = a;i <= b;i++)

typedef long long ll;

using namespace std;

const int maxn = 100 + 10;
const double eps = 1e-8;
double a[maxn][maxn], x[maxn];
int equ, var;
int n, m;
double rs[maxn][maxn];

//int gauss()
//{
//int i,j,k,col,max_r;
//for(k=0,col=0;k<equ&&col<var;k++,col++)
//{
//max_r=k;
//for(i=k+1;i<equ;i++)
//if(fabs(a[i][col])>fabs(a[max_r][col]))
//max_r=i;
//if(fabs(a[max_r][col])<eps)return 0;
//if(k!=max_r)
//{
//for(j=col;j<var;j++)
//swap(a[k][j],a[max_r][j]);
//swap(x[k],x[max_r]);
//}
//x[k]/=a[k][col];
//for(j=col+1;j<var;j++)a[k][j]/=a[k][col];
//a[k][col]=1;
//for(i=0;i<equ;i++)
//if(i!=k)
//{
//x[i]-=x[k]*a[i][k];
//for(j=col+1;j<var;j++)a[i][j]-=a[k][j]*a[i][col];
//a[i][col]=0;
//}
//}
//return 1;
//}

void gauss()
{
    for(int k=0,col=0; k<equ&&col<var; k++,col++)
    {
        int max_k = k;
        for(int i = k+1; i < equ; i++)
        {
            if(fabs(a[i][col]) > fabs(a[max_k][col]))
            {
                max_k = i;
            }
        }
        if(fabs(a[max_k][col]) < eps)
        {
            break;
        }
        if(max_k!=k)
        {
            swap(x[k], x[max_k]);
            for(int i = col; i<var; i++)
            {
                swap(a[k][i], a[max_k][i]);
            }
        }
        x[k] /= a[k][col];
        for(int i=col+1; i<var; i++)
        {
            a[k][i] /= a[k][col];
        }
        a[k][col]=1;
        for(int i=0; i < equ; i++)
        {
            if(i != k)
            {
                x[i] -= a[i][col]*x[k];
                for(int j=col+1; j < var; j++)
                {
                    a[i][j] -= a[i][col]*a[k][j];
                }
                a[i][col] = 0;
            }
        }
    }
}

void solve()
{
    CLR(a);
    CLR(x);
    CLR(rs);
    equ = n;
    var = n;
    a[0][0] = 1;
    x[0] = 0;

    for(int i = 1; i < n-1; i++)
    {
        x[i] = 0;
    }
    while(m--)
    {
        int x, y, r;
        scanf("%d%d%d", &x, &y, &r);
        double s = 1.0/r;
        x--;
        y--;
        rs[x][y]=rs[y][x]=s;
        if(x!=0)
        {
            a[x][x] += s;
            a[x][y] -= s;
        }
        if(y!=0)
        {
            a[y][y] += s;
            a[y][x] -= s;
        }
    }
    x[equ - 1] = 1;
    gauss();
    printf("%.2f\n", x[n-1]);
//    double ans = 0;
//    for(int i = 0;i < n -1;i++)
//    {
//        if(rs[n-1][i] != 0)
//            ans += (x[n-1]-x[i])*rs[n-1][i];
//    }
//    printf("%.2f\n", x[n-1]/ans);
}

int main()
{
    //freopen("11Kin.txt", "r", stdin);
    //freopen("1out.txt", "w", stdout);
    while(scanf("%d%d", &n, &m) != EOF)
    {
        solve();
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HDU 3532 Max Angle(计算几何——极角排序)

传送门 Max AngleTime Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T...

求解释!!!zoj3532 ZOJ Monthly, September 2011

此题一直WA,此为WA的代码,哪位神牛级的人物帮我解答一下,在下不胜感激!!!! #include #include #include #include #include #inclu...

Hi3532-H264编码处理器简介

  • 2016-06-28 09:36
  • 224KB
  • 下载

POJ 3335 Rotating Scoreboard(半平面交模版题)

Rotating Scoreboard Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7117 Accept...

3532-LRC 电桥测试

  • 2010-12-27 21:03
  • 731KB
  • 下载

3532驱动一件安装包

  • 2014-11-27 12:12
  • 9.57MB
  • 下载

POJ - 3735 Training little cats

Training little cats time limit per test 2 seconds memory limit per test 256 megabytes Descrip...

Poj1155题解

  • 2016-09-29 13:40
  • 100KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)