HDU 3666 The MATRIX PROBLEM (差分约束系统,除化减)

本文介绍了一个关于矩阵的问题,目标是判断是否存在一系列操作使得矩阵中所有元素位于特定区间内。通过数学转换,问题被转化为差分约束系统,并使用栈优化后的SPFA算法进行求解。

THE MATRIX PROBLEM

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8855    Accepted Submission(s): 2281


Problem Description
You have been given a matrix CN*M, each element E of CN*M is positive and no more than 1000, The problem is that if there exist N numbers a1, a2, … an and M numbers b1, b2, …, bm, which satisfies that each elements in row-i multiplied with ai and each elements in column-j divided by bj, after this operation every element in this matrix is between L and U, L indicates the lowerbound and U indicates the upperbound of these elements.
 

Input
There are several test cases. You should process to the end of file.
Each case includes two parts, in part 1, there are four integers in one line, N,M,L,U, indicating the matrix has N rows and M columns, L is the lowerbound and U is the upperbound (1<=N、M<=400,1<=L<=U<=10000). In part 2, there are N lines, each line includes M integers, and they are the elements of the matrix.

 

Output
If there is a solution print "YES", else print "NO".
 

Sample Input
3 3 1 6 2 3 4 8 2 6 5 2 9
 

Sample Output
YES
根据题意有L<=n[i][j]*a[i]/b[j]<=U;
即L/n[i][j]<=a[i]/b[j];a[i]/b[j]<=U/n[i][j];
两边取对数,转化成减的形式:
log(a[i])-log(b[j])>=log(L/n[i][j]);
log(b[j])-log(a[i])>=-log(U/n[i][j]);
这样转化后就可以用差分约束系统求解,但是这里的log(a[i])是小数
为方便连边,把log(a[1])~log(n)看作是整数1~n;
把log(b[1])~log(b[m])看作是整数n+1~n+m;
这题还有特别鬼畜的一点,一开始用队列做的,一直超时,觉得自己解法
已经足够优化了,后来去查了别人的代码,是用栈做的,奇怪的是只是
把队列改成栈就节省了一半的时间,真不知道为什么。
#include<bits/stdc++.h>
int n,m,L,U,anc[1002],tol,head[1002];
double d[1002];
bool vis[1002];
using namespace std;
struct node
{
    int to,next;
    double cost;
}rode[400003];
void add(int a,int b,double c)
{
    rode[tol].to=b;
    rode[tol].cost=c;
    rode[tol].next=head[a];
    head[a]=tol++;
}
bool spfa()
{
    int i,j;
    for(i=0;i<=1000;i++)
        d[i]=-1e9*1.0;
    memset(anc,0,sizeof(anc));
    memset(vis,0,sizeof(vis));
    stack<int>P;
    while(!P.empty())P.pop();
    P.push(1);vis[1]=1;d[1]=0;
    while(!P.empty())
    {
        int v=P.top();P.pop();vis[v]=0;
        for(i=head[v];i!=-1;i=rode[i].next)
        {
            node e=rode[i];
            if(d[e.to]<d[v]+e.cost)
            {
                d[e.to]=d[v]+e.cost;
                if(!vis[e.to])
                {
                    P.push(e.to);
                    vis[e.to]=1;
                    anc[e.to]++;
                    if(anc[e.to]>m+n)return 0;
                }
            }
        }
    }
    return 1;
}
int main()
{
    while(~scanf("%d%d%d%d",&n,&m,&L,&U))
    {
        int i,j;tol=0;
        memset(head,-1,sizeof(head));
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
            {
                int x;scanf("%d",&x);
                add(j+n,i,log(1.00*L/x));
                add(i,j+n,-log(1.00*U/x));
            }
        if(spfa())printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}


内容概要:本文针对传统三电平并网逆变器存在的谐波含量高、电网不平衡工况适应性差及动态响应慢等问题,以有源中点箝位(ANPC)三电平并网逆变器为研究对象,提出了一种融合双极性倍频脉宽调制(DPWMA)、正负序分离锁相技术和电网电压前馈控制的高性能一体化并网控制策略。该策略通过构建“精准同步-扰动补偿-优质调制”的协同控制体系,充分发挥ANPC拓扑在开关损耗均衡、输出波形质量高和中点电位可控方面的硬件优势。其中,DPWMA调制在不增加器件实际开关频率的前提下实现等效开关频率倍增,显著降低并网电流谐波;正负序分离锁相技术有效隔离电网负序扰动,确保不平衡工况下的精确相位同步;电网电压前馈控制则提前补偿电网扰动,大幅提升系统的动态响应速度与抗扰能力。通过Simulink搭建完整仿真模型,对稳态对称、电网电压不平衡及动态扰动等多种工况进行了全面验证,结果表明该复合控制策略能显著提升电能质量、锁相精度和系统稳定性,适用于复杂电网环境下的大功率并网应用。; 适合人群:电气工程、自动化、新能源发电等相关领域的科研人员、研究生及从事电力电子与并网逆变器开发的工程技术人员。; 使用场景及目标:①研究高电能质量要求下的大功率并网逆变器控制方法;②解决电网电压不平衡、畸变等非理想工况下的并网稳定性问题;③提升并网系统的动态响应能力和抗扰性能,适用于新能源电站、工业变流装置等实际应用场景。; 阅读建议:建议结合文中提供的Simulink仿真模型进行实践操作,重点关注DPWMA调制实现、正负序分离算法结构与电网前馈补偿机制的设计细节,通过对比传统控制策略深入理解复合控制的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值