关闭

poj3532

222人阅读 评论(0) 收藏 举报
分类:

算电阻

题目描述:

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;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:43118次
    • 积分:2402
    • 等级:
    • 排名:第15438名
    • 原创:206篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    最新评论