UVA 11082 Matrix Decompressing

本文介绍了一种使用网络流算法解决特定矩阵构造问题的方法。针对一个r行c列的正整数矩阵,通过给定的行和列的前缀和,文章详细描述了如何构建网络流模型来找到符合条件的矩阵元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:对于r行c列的正整数矩阵,设Ai为前i行所有元素之和,Bi为前i列所有元素之和,已知R,C和数组A,B,找出满足条件的矩阵,矩阵元素必须是1~20

解题思路:因为元素范围为1~20,所以可以将所有元素减1使得范围变成0~19,并根据Ai,Bi计算出每行,每列的元素和为AAi,BBi
网络流构建:设0为原点s,m+n+1为汇点t,行数为1~m,列数为m+1~m+n
将s与所有行相连,容量为AAi-C,将所有列与t相连,容量为BBi-r,最后将所有行与所有列相连,容量19
求出最大流,最后的x行与y列相连的流量就是(x,y)元素的值

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define INF 0x3f3f3f
#define maxn 100
struct Edge {
    int from;
    int to;
    int cap;
    int flow;
    Edge(int from, int to, int cap, int flow):from(from),to(to),cap(cap),flow(flow){}
};
int a[maxn];
int b[maxn];
int re[maxn][maxn];
vector<Edge> edges;
vector<int> G[maxn];
int m, n; //m行n列
void addEdge(int from, int to, int cap) {
    edges.push_back(Edge(from, to, cap, 0));
    edges.push_back(Edge(to, from, 0, 0));
    int i = edges.size();
    G[from].push_back(i-2);
    G[to].push_back(i-1);
}
int EK(int s, int t) {
    int visit[maxn];
    int flow = 0;
    int pre[maxn];
    while(1) {
        memset(visit, 0, sizeof(visit));
        queue<int> que;
        que.push(s);
        visit[s] = INF;
        while(!que.empty()) {
            int poi = que.front();
            que.pop();
            for(int i = 0; i < G[poi].size(); i++) {
                Edge& ed = edges[G[poi][i]];
                if(!visit[ed.to] && ed.cap > ed.flow) {
                    que.push(ed.to);
                    pre[ed.to] = G[poi][i];
                    visit[ed.to] = min(visit[poi], ed.cap-ed.flow);

                }
            }
            if(visit[t])
                break;
        }
        if(!visit[t])
            break;
        for(int i = t; i != s; i = edges[pre[i]].from) {
            edges[pre[i]].flow += visit[t];
            edges[pre[i]^1].flow -= visit[t];

        }
        flow += visit[t];
    }
    return flow;
}
void input() {
    cin >> m;
    cin >> n;
    for(int i = 1; i <= m; i++) {
        cin >> a[i];;

    }
    for(int i = 1; i <= n; i++) {
        cin >> b[i];
    }
    for(int i = m; i != 1; i--) {
        a[i] = a[i] - a[i-1];
    }
    for(int i = n; i != 1; i--) {
        b[i] = b[i] - b[i-1];
    }
}

void init() {
    for(int i = 0; i <= m+n+1; i++)
        G[i].clear();
    edges.clear();
    for(int i = 1; i <= m; i++) {
        addEdge(0, i, a[i]-n);
    }
    for(int i = m+1; i <= m+n; i++) {
        addEdge(i, m+n+1, b[i-m]-m);
    }
    for(int i = 1; i <= m; i++) {
        for(int j = m+1; j <= m+n; j++) {
            addEdge(i, j, 19);
        }
    }
}
void output(int o) {
    EK(0, m+n+1);
    cout << "Matrix " << o << endl;
    for(int i = 1; i <= m; i++) {
        for(int j = m+1; j <= m+n; j++) {
            for(int k = 0; k  < G[i].size(); k++) {
                if(edges[G[i][k]].to == j) {
                    cout << edges[G[i][k]].flow + 1;
                    if(j - m != n)
                        cout << " ";
                    break;
                }
            }
        }
        cout << endl;
    }
    cout << endl;
}
int main() {
    int all;
    cin >> all;
    for(int i = 1; i <= all; i++) {
        input();
        init();
        output(i);
    }
}
内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值