hdu 3338 网络流填数字

Multi-Agent Multi-Agent System(MAS,多代理系统)是分布式人工智能(DAI)领域皇冠上的明珠,其核心思想是通过多个自主、交互、目标导向的智能体(Agent)的协同与竞争,解决单智能体无法或难以高效处理的复杂问题——包括大规模资源调度、多模态数据理解与决策、复杂软件架构的自治运维、甚至未来城市级的交通与能源管理。本文将以结构化分析推理和第一性原理思考。 阅读详情

Kakuro Extension

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1268    Accepted Submission(s): 439
Special Judge


Problem Description
If you solved problem like this, forget it.Because you need to use a completely different algorithm to solve the following one.
Kakuro puzzle is played on a grid of "black" and "white" cells. Apart from the top row and leftmost column which are entirely black, the grid has some amount of white cells which form "runs" and some amount of black cells. "Run" is a vertical or horizontal maximal one-lined block of adjacent white cells. Each row and column of the puzzle can contain more than one "run". Every white cell belongs to exactly two runs — one horizontal and one vertical run. Each horizontal "run" always has a number in the black half-cell to its immediate left, and each vertical "run" always has a number in the black half-cell immediately above it. These numbers are located in "black" cells and are called "clues".The rules of the puzzle are simple:

1.place a single digit from 1 to 9 in each "white" cell
2.for all runs, the sum of all digits in a "run" must match the clue associated with the "run"

Given the grid, your task is to find a solution for the puzzle.
              
        Picture of the first sample input            Picture of the first sample output
 

Input
The first line of input contains two integers n and m (2 ≤ n,m ≤ 100) — the number of rows and columns correspondingly. Each of the next n lines contains descriptions of m cells. Each cell description is one of the following 7-character strings:

.......— "white" cell;
XXXXXXX— "black" cell with no clues;
AAA\BBB— "black" cell with one or two clues. AAA is either a 3-digit clue for the corresponding vertical run, or XXX if there is no associated vertical run. BBB is either a 3-digit clue for the corresponding horizontal run, or XXX if there is no associated horizontal run.
The first row and the first column of the grid will never have any white cells. The given grid will have at least one "white" cell.It is guaranteed that the given puzzle has at least one solution.
 

Output
Print n lines to the output with m cells in each line. For every "black" cell print '_' (underscore), for every "white" cell print the corresponding digit from the solution. Delimit cells with a single space, so that each row consists of 2m-1 characters.If there are many solutions, you may output any of them.
 

Sample Input
  
6 6 XXXXXXX XXXXXXX 028\XXX 017\XXX 028\XXX XXXXXXX XXXXXXX 022\022 ....... ....... ....... 010\XXX XXX\034 ....... ....... ....... ....... ....... XXX\014 ....... ....... 016\013 ....... ....... XXX\022 ....... ....... ....... ....... XXXXXXX XXXXXXX XXX\016 ....... ....... XXXXXXX XXXXXXX 5 8 XXXXXXX 001\XXX 020\XXX 027\XXX 021\XXX 028\XXX 014\XXX 024\XXX XXX\035 ....... ....... ....... ....... ....... ....... ....... XXXXXXX 007\034 ....... ....... ....... ....... ....... ....... XXX\043 ....... ....... ....... ....... ....... ....... ....... XXX\030 ....... ....... ....... ....... ....... ....... XXXXXXX
 

Sample Output
  
_ _ _ _ _ _ _ _ 5 8 9 _ _ 7 6 9 8 4 _ 6 8 _ 7 6 _ 9 2 7 4 _ _ _ 7 9 _ _ _ _ _ _ _ _ _ _ _ 1 9 9 1 1 8 6 _ _ 1 7 7 9 1 9 _ 1 3 9 9 9 3 9 _ 6 7 2 4 9 2 _
 

Author
NotOnlySuccess@HDU
 

Source
 

Recommend
lcy   |   We have carefully selected several similar problems for you:   1569  2732  1565  1533  3416 
 
题目是给出类似图片那样的网格,在空白格子填入一个数,使行和或者列和等于黑格子中的数,每个格子填入的数在1-9分为内,找出任意一个满足的解。

一个数等于若干个数的和,可以看做一条入流分解为若干条出流,入流量等于总的出流量。每个格子(i,j)可以由行和列两个坐标确定,所以要在建立行的点和列的点,代表i行的点向代表j列的点连接一条边(容量范围【1,9】)就是代表(i,j)这个格子。黑格子的总和,可以分表表示为流入行点的总流量和跟流出列点的总流量和。某些行(列)可能有多个约束总和,我们可以将每个总和都看做单独一行(列),所以实际的行数和列数并不一定等于原图的。还要记录每个格子对应那一条边,最后流过那条边的总流量就是要填的数字。

每个格子范围是[1,9]的流量,这样的上下界不方便处理,可以统一都减去1变成[0,8]的范围,最后答案再加回1.这样就没有下界需要处理了。


#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;

const int maxn =20005;
const int inf=0x3f3f3f3f;

struct Edge
{
    int v,cap,nxt;
};
int first[maxn],tot;
Edge edge[200*maxn];
int n,m;
int S,T;
void addedge(int u, int v, int cap)
{
    edge[tot]=Edge{v,cap,first[u]};
    first[u]=tot++;
    edge[tot]=Edge{u,0, first[v]};
    first[v]=tot++;
}

struct Val{
    int fir,sec;
    int emp;
};

Val mp[200][200];
int r[200][200],c[200][200],bel[200][200];
int row[10000],col[10000];
Val turn(char s[8])
{
    Val ret;
    if(s[0]=='X' || s[0]=='.') ret.fir=-1;
    else{
        int tmp=0;
        for(int i=0; i<3; i++){
            tmp=tmp*10+s[i]-'0';
        }
        ret.fir=tmp;
    }

    if(s[4]=='X'||s[4]=='.') ret.sec=-1;
    else{
        int tmp=0;
        for(int i=0; i<3; i++){
            tmp=tmp*10+s[i+4]-'0';
        }
        ret.sec=tmp;
    }

    ret.emp= (s[0]=='.'&&s[4]=='.');
    return ret;
}

void init()
{
    tot=0;
    memset(first, -1, sizeof(first));

    char s[8];
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            scanf("%s", s);
            mp[i][j]=turn(s);
        }
    }

    S=0,T=n*m+1;
    int rowc=1,colc=1;
    int cnt=1;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            Val cur=mp[i][j];
            if(cur.emp){
                continue;
            }
            if(cur.sec!=-1){
                int ed=j+1;
                while(ed<=m && mp[i][ed].emp) r[i][ed]=rowc,ed++;
                row[rowc]=cnt++;
                addedge(0, row[rowc++], cur.sec-(ed-j-1));
            }

            if(cur.fir!=-1){
                int ed=i+1;
                while(ed<=n && mp[ed][j].emp) c[ed][j]=colc,ed++;
                col[colc]=cnt++;
                addedge(col[colc++], T, cur.fir-(ed-i-1));
            }
        }
    }
    memset(bel, -1, sizeof(bel));
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++)
        if(mp[i][j].emp){
            addedge(row[r[i][j]], col[c[i][j]], 8);
            bel[i][j]=tot-2;
        }
    }

}



int d[maxn];
int que[maxn*100], head,tail;
void bfs(int s)
{
    memset(d, inf, sizeof(d));
    d[s]=0;
    head=0;tail=-1;
    que[++tail]=s;

    while(tail+1!=head){
        int u=que[head++];

        for(int i=first[u]; i!=-1; i=edge[i].nxt){
            int v=edge[i].v, c=edge[i].cap;
            if(d[v]!=inf || !c) continue;
            d[v]=d[u]+1;
            que[++tail]=v;
        }
    }

}

int cur[maxn];
int dfs(int u, int T, int f)
{
    if(u==T) return f;

    for(int &i=cur[u]; i!=-1; i=edge[i].nxt){
        int v=edge[i].v, c=edge[i].cap, r=i^1;
        if(d[v]!=d[u]+1 || !c) continue;
        int tmp=dfs(v, T, min(c,f));
        if(tmp){
            edge[i].cap-=tmp;
            edge[r].cap+=tmp;
            return tmp;
        }
    }
    return 0;
}



int dinic(int S, int T)
{
    int ret=0;
    while(true){
        bfs(S);
        if(d[T]==inf) break;

        for(int i=0; i<=T; i++) cur[i]=first[i];
        int f=inf;
        while( (f=dfs(S,T,f))>0) ret+=f;
    }
    return ret;
}

int ans[maxn][maxn];

int main()
{
    int cas=1;
    while(cin>>n>>m){
        init();
        int t=dinic(S, T);
        for(int i=1; i<=n; i++){
            for(int j=1; j<=m; j++){
                int p=n+m+j+(i-1)*m;
                if(bel[i][j]==-1){
                    ans[i][j]=0;
                    continue;
                }
                ans[i][j]=9-edge[bel[i][j]].cap;
            }
        }

        for(int i=1; i<=n; i++){
            for(int j=1; j<=m; j++){
                if(!ans[i][j])
                    putchar('_');
                else printf("%d", ans[i][j]);
                putchar(j==m?'\n':' ');
            }
        }

    }
    return 0;
}



分布式计算Ray框架面试题及参考答案 动态任务图执行引擎是一种能够根据任务之间的依赖关系和运行时的实际情况,动态构建和执行任务图的系统。在 Ray 中,动态任务图执行引擎允许任务在运行时根据数据可用性、计算资源状态等因素,灵活地决定后续任务的执行顺序和方式。对于 AI 应用来说,其往往具有动态性的特点。例如,在深度学习模型的训练过程中,可能需要根据训练的结果动态调整下一轮训练的参数、数据增强方式或者模型结构。动态任务图执行引擎可以很好地支持这些动态需求。它能够根据 AI 应用中各个任务的实时输出和依赖关系,动态地生成和调整任务图。 阅读详情

相关推荐

NLP实战:如何用CoNLL-2003数据集快速提升命名实体识别模型性能(附完整代码)

本文详细介绍了如何利用CoNLL-2003公开数据集,通过深度剖析数据特点、构建鲁棒的数据预处理流水线、选择合适的模型架构(如BERT-CRF)以及优化训练策略,来系统性地提升命名实体识别(NER)模型的性能。文章提供了完整的代码示例,并分享了处理数据不均衡、标签对齐等核心挑战的实战技巧,帮助读者从理论到实践全面掌握NER任务。

cola5的博客 494

hdu3338 / 方格横纵和问题终极版,最大流斩

此题被誉为神奇最大流,诱惑我去做了下,感觉也是通常的思路。 题意:1.用1-9去填,满足所给的行/列和要求(和那个什么游戏差不多。。。) 求一种合法方案,输出。如:               一看,直接就建图了,每个点在白色的点中间,由横和=纵和,管理横和的在左边,纵和的点在右边。S->横和点,纵和点到t,建图即可。 有一点注意,由于只能用1-9去填,是有上下界的网...

weixin_34174422的博客 219

AURIX TC397开发板到手第一步:用iLLD库驱动LED流水灯(附完整代码)

本文详细介绍了如何使用英飞凌AURIX TC397开发板和iLLD库实现LED流水灯效果。从开发环境配置到硬件连接,再到完整的代码实现,逐步引导开发者完成项目。文章还提供了优化建议和常见问题解决方案,帮助嵌入式开发新手快速上手。

weixin_30911451的博客 390

HDU3338 (建图原理详解)

很经典的题,但是看到还是没思路,太蠢了. 注意下面的行列指的是连续空白格子组成的行和列(意思是每行可以分出多个行) 注意到每个空白格子上的数字只会贡献给本列上面的数字和本行左边的数字 所以可以考虑把每行每列抽象为一个点 空白格子连向对应行和对应列,流量是[1,9][1,9][1,9] 但是流量最低可以是000,所以我们把流量设置为888,这样[0,8][0,8][0,8]可以映射[1,9][1,9][1,9] 但这样有个问题,空白格子流向对应行的流量应该等于对应列的流量 所以可以把空白格子放中间这样建图

jziwjxjd的博客 487

量化爬虫实战:手把手教你搞定同花顺问财的hexin-v参数(附JS逆向思路与Cookie Hook技巧)

本文详细解析了如何通过JS逆向技术获取同花顺问财平台的`hexin-v`参数,包括Cookie Hook技巧和完整解决方案架构。从环境搭建到参数定位,再到生成逻辑逆向,手把手教你突破数据获取限制,为量化交易提供可靠数据支持。

weixin_42557803的博客 398

双向全桥隔离dc-dc变换器(DAB)

在全功率范围内,零电压开通优化调制方法能够实现双向全桥隔离dc-dc变换器所有开关的零电压开通,来提升变换器的效率,但其调制模式不连续。当变换器两端电压不匹配时,变换器的电流应力和回流功率将增加,软开关范围将变窄,变换器的效率显著降低。在轻载时,这两种电流优化调制方法采用相同的调制模式;在重载时,最小电流有效值调制方法具有两种调制模式,而最小电流应力调制方法只有一种。双向全桥隔离dc-dc变换器(DAB)和Buck/Boost不同,该变换器通过交流电感进行功率传输,其调制和控制不适合直接借鉴已有的研究。

m0_59329334的博客 3533

HDU 3338:Kakuro Extension(脑洞大开的网络流)

http://acm.hdu.edu.cn/showproblem.php?pid=3338 题意:在一个n*m的地图里面,有黑方块和白方块,黑方块可能是“XXXXXXX”或者“YYY/YYY”,这里的YYY代表可能为数字,如果是在“/”左边出现数字,代表在它下面的该列的白方块的和加起来要等于这个数字,如果是在“/”右边出现数字,代表它右边的该行的白方块的和加起来要等于这个数字。我们要做的就是求...

weixin_30325487的博客 189

【WRFDA教程第一期】运行观测预处理程序(OBSPROC)

运行观测预处理程序(OBSPROC)

WW、forever的博客 1896

hdu3338 类似数独 网络流dinic(关于行列建图的巧妙)

边容量即为所填数 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<queue> 5 using namespace std; 6 #define inf 0x3f3f3f3f 7 struct Edge ...

weixin_33918114的博客 156

CKS-CN考试之路----02

其实我们根据题目也可以知道秘钥是叫clever-cactus。稍作等待后,确认pod的状态,如果是1/1基本就没问题了。这步不一定做.目的是确定秘钥的名字。

Q先生 654

2024年下半年网络规划设计师论文真题

3、深入论述自身参与的工业网络是如何实施的,为实现制造业的智能化,如何实现数据的跨系统互通,促进各种工业数据的充分流动和无缝集成以及数据安全。3、结合自身参与的网络建设,详细叙述针对该网络“去NAT”的规划和设计方案。4、在实施过程中遇到的问题以及如何处理,项目实施后的效果和评价。2、大型园区网络“去NAT”改造和业务融合的整体架构。1、“网络去NAT”对推进ipv6演进和应用的意义。4、改造过程中遇到的问题及解决方案。2、简要叙述自身参与的制造网络建设。1、网络规划在智能制造中的意义。

鹿鸣天涯 2367

Kakuro Extension HDU - 3338 (毒瘤+MLE+网络流+数独)

传送门 先说注意: MLE不止与空间有关,还与时间有关的样子。这里M太大就MLE了emm,还一直不知道错在哪里emm. 尽量使用for而不是memset初始化(说的时限制严格的情况下) 其实不必特别注意,只需要知道MLE问题出现在哪儿即可。 题意:n*m的方格。填数——类似数独规则,懂的都懂。 n,m<=100 只能填数1~9 题解:最大流。s->黑横->白->黑竖->t 代码: #include <algorithm> #in

I_have_a_world的博客 244

电子元器件-逻辑器件篇:逻辑电平、CMOS逻辑、手册解读、逻辑电平转换,应用注意事项

常用的逻辑电平TTL、CMOS、LVTTL、LVCOMS、CML、ECL、PECL、LVPECL、LVDS、RS232电平RS422电平,RS485电平等。TTL和CMOS的逻辑电平按典型电压可分为四类:5V系列、3.3V系列,2.5V系列和1.8V系列。5V TTL和5V CMOS逻辑电平是通用的逻辑电平。3.3V及以下的逻辑电平被称为低电压逻辑电平,常用的为LVTTL电平低电压的逻辑电平还有2.5V和1.8V两种。

qq_60226558的博客 863

HDU 3338 Kakuro Extension 网络流

题意:给一个N∗NN*N的矩阵,白色的格子要求填数(范围1~9),要求:如果有出现如028\XXX(称为上边的情况),则表示,我这个格子下面所有的白格子中的数字之和要等于这个。如果有出现XXX\028(称为左边的情况),则表示,我这个格子右边所有的白格子中的数字之和要等于这个。思路:神奇的网络流。白格子需要拆为入点和出点,来控制经过白格子的流量。源点与每个左边的情况连一条流量为左边情况数字的边,每个

NM的专栏 465

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

HDU 3338 网络流 建图

原题位置http://acm.hdu.edu.cn/showproblem.php?pid=3338 这道题的意思就是 给你一个由黑白方格构成的图 白方格全部空着 黑方格有的会有数字 在左下角的数字表示这个方格往下的所有白方格(直到边界或者碰到另外的黑方格) 里面填的数字的和 在右上角的数字表示这个方格往右的所有白方格(直到边界或者碰到另外的黑方格) 里面填的数字的和 问 怎么在白格子里填上...

FW的博客 278

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

HDU3338 Kakuro Extension 网络流 isap

HDU3338 Kakuro Extension 网络流 isap

NNDXNM的专栏 722

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【最大流】【HDU3338】【Kakuro Extension】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3338 题目大意:填数字,使白色区域的值得和等于有值得黑色区域的相对应的值,用网络流来做 题目思路:增加一个源点和汇点,然后左进上出,用源点连左面,容量为相对应的值,汇点连上面,容量是相对应的值,然后左面连空白区域的,容量为8,因为数字为1-9,有下限,但因每个空白必须有值,所以至少为一

学习之路 668

hdu3338 神奇网络流(最大流) Kakuro Extension

大意:   原数谜是个很有趣的游戏,如图,每一行或每一列空白称为一个回,每一回都对应着一个整数sum,sum就是这回的和。这些空白格里只能填入1—9这九个数字,且在每一回中不能重复。全黑色的格为空,有数字的格,左下角的表示列的和,右上角的表示行的和,则可以得到下面这个图。 但这道题不是原来的数谜,这题与原数谜相比,少了一点规则,就是,每一回中出现的数字可以重复。给你一个n * m 的图,

lyc 1354

网络流_hdu3338Kakuro Extension (神奇最大流 Dinic)

题意:         给一个表格的横纵和,用1~9去填,数字可重复,求一种解决方案。                 建图思路:         从空白格任取一个数,假定这个数所在为i行j列。则这个数的数值既被包括在行之和中,也被包括在列之中。那么我们可以采用行进列出的思想。从原点连向行之和节点,从列之和节点连向汇点。 中间就通过任意的空白格节点将行之和与列之和连接起来。题目要求是

野生的TFgirl 749

hdu -3338 最大流 行列建图 dinic

题意:题目是给出类似图片那样的网格,在空白格子填入一个数,使行和或者列和等于黑格子中的数,每个格子填入的数在1-9分为内,找出任意一个满足的解。 建图:   sp-左-空白-上-tp(sp-上-空-左-tp) 总共5种点 1.type=0  黑格 2.type=1  空格 3.type=2 有两个数字的格子 4.type=3 只有上边数字的格子 5.type=4 只有左边数字的格...

陌离将离 331

HDU 3338 Kakuro Extension(网络流)

HDU 3338 Kakuro Extension 题目链接 题意:完成如图的游戏,填充数字1-9 思路:网络流的行列模型,把每行每列连续的一段拆分出来建图即可,然后题目有限制一个下限1,所以 每行每列的容量减去相应的数字,然后建图建容量8就好,这样就默认原来容量已经有1了 代码: #include #include #include #include usi

Remilia's 1094

HDU - 3338 Kakuro Extension(最大流+思维建边)

题目链接:点击查看 题目大意:填数游戏,给出一个n*m的矩阵,矩阵中存在三种方块: 纯黑的方块:没什么用 纯白的方块:等待我们填数字的方块 黑色方块上有数字: 左下角有数字:当前黑色方块下面的白色方块内数字之和等于当前数字 右上角有数字:当前黑色方块右面的白色方块内数字之和等于当前数字 在满足上述规则的条件下,将矩阵补充完整 题目分析:因为在填写矩阵的时候,可以使用重复数字,数...

Falcon的博客 411

HDU 3338 - Kakuro Extension(网络流‘最大流)

题目: http://acm.hdu.edu.cn/showproblem.php?pid=3338 题意: 给你一个n*m的矩阵,往空白格里面填 1~9的数字,得到列等于左下角的数字,行等于右下角的数字。 思路: 最大流的性质,流入容量会等于流出容量。和题目中的行总和会等于列总和性质相同,由此可以建图。 为了方便建图,本应填入1~9,改为填入0~8,行列和相应减去,便可同普通的最

Halo 770

HDU3338 Kakuro Extension —— 最大流、方格填数类似数独

题目链接:https://vjudge.net/problem/HDU-3338 Kakuro Extension Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2419Accepted Submission(...

alince20008的博客 198

Kakuro Extension 【HDU - 3338】【最大流】

题目链接 题意:这个题意真的让我读了好久,一开始当真也还真不会往网络流上想,是这样的题意:给你一张N*M的图,其中,对于每个黑点,它如果是某个开始点,那么他就是只能向右或者向下有固定的值,否则,就是这样的“向下/向右”的输入形式,代表着达到下一个非白色节点之前的所放的数的总和应该和为该值。就是说,对于向下方向,那么这个点往下的所有白空格,只能填入1~9,并且连续的白空格之和应该为向下方向上的...

既然弱小,就只顾变强就是了 404

HDU3338 Kakuro Extension(最大流+思维构图)

这道题一定要写一下,卡了好久。 题意: 有黑白两种方格,最上边一行和最左边一列一定是黑色,然后其余的地方有可能是黑色,有可能是白色,和白色相邻的黑色方格里有数字(1个或2个), 现在要求在白色方格里填1~9中的一个数字,使得一个黑色方格下边的数字 = sigma(该黑色方格下边白色方格数字) 这个sigma不是下边全部的白方格, 而是一直往下走一直走到一个黑方格之前所有的白方格,详情见样...

weixin_30535913的博客 73
上一篇: poj 1741 树分治入门
下一篇: hdu 3416 最短路+网络流(不重叠最短路径计数)
HuanTongH
博客等级 码龄12年 7粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值