`

HDU 1565 方格取数(1) (EK 邻接表 & 非邻接表 建图)

 
阅读更多

方格取数(1)

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3086    Accepted Submission(s): 1182


Problem Description
给你一个n*n的格子的棋盘,每个格子里面有一个非负数。
从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。
 

 

Input
包括多个测试实例,每个测试实例包括一个整数n 和n*n个非负数(n<=20)
 

 

Output
对于每个测试实例,输出可能取得的最大的和
 

 

Sample Input
3 75 15 21 75 15 28 34 70 5
 

 

Sample Output
188
 

 

Author
ailyanlu
 

 

Source
 

 

Recommend
8600
 

 

1,EK:(邻接表建图)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>

using namespace std;

const int VM=30;
const int EM=30000;
const int INF=0x3f3f3f3f;

int n;
int map[VM][VM],g[1010][1010],pre[1010];

struct Edge{
    int u,v,nxt;
    int cap;
}edge[EM];

int src,des;

int EK(){
    int maxflow=0;
    while(1){
        memset(pre,-1,sizeof(pre));
        queue<int> q;
        while(!q.empty())
            q.pop();
        int tmp=INF;
        q.push(src);
        while(!q.empty()){
            int cur=q.front();
            q.pop();
            for(int i=1;i<=n*n+1;i++){
                if(g[cur][i]!=0 && pre[i]==-1){
                    tmp=min(tmp,g[cur][i]);
                    pre[i]=cur;
                    q.push(i);
                }
            }
            if(pre[des]!=-1)
                break;
        }
        if(pre[des]==-1)
            break;
        int u=des;
        while(u!=src){
            g[pre[u]][u]-=tmp;
            g[u][pre[u]]+=tmp;
            u=pre[u];
        }
        maxflow+=tmp;
    }
    return maxflow;
}

int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

int main(){

    //freopen("input.txt","r",stdin);

    while(~scanf("%d",&n)){
        memset(g,0,sizeof(g));
        int sum=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){
                scanf("%d",&map[i][j]);
                sum+=map[i][j];
            }
        src=0,des=n*n+1;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){
                if((i+j)%2==0)
                    g[src][(i-1)*n+j]=map[i][j];    //addedge(src,(i-1)*n+j,map[i][j]);
                else
                    g[(i-1)*n+j][des]=map[i][j];    //addedge((i-1)*n+j,des,map[i][j]);
            }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                for(int k=0;k<4;k++){
                    int x=i+dir[k][0];
                    int y=j+dir[k][1];
                    if(x>=1 && x<=n && y>=1 && y<=n && (i+j)%2==0)
                         g[(i-1)*n+j][(x-1)*n+y]=INF;   //addedge((i-1)*n+j,(x-1)*n+j,INF);
                }
        printf("%d\n",sum-EK());
    }
    return 0;
}

 

2,非邻接表建图:头脑不清楚了,,有空再写吧

 

分享到:
评论

相关推荐

    HDU 递归题详解大全(含代码)

    蟠桃记 1 折线分割平面 2 不容易系列之一 2 骨牌铺方格 3 不容易系列之(3)—— LELE的RPG难题 3 Children’s Queue 3 献给杭电五十周年校庆的礼物 3 钥匙计数之二 3 钥匙计数之一 3 母牛的故事 3 超级楼梯 3 不容易...

    hdu.rar_hdu

    3. **数据结构**:数组、链表、栈、队列、树(二叉树、平衡树如AVL和红黑树)、图(邻接矩阵、邻接表、最小生成树、拓扑排序等)。 4. **字符串处理**:KMP算法、Manacher's Algorithm、Rabin-Karp算法等。 5. **...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    hdu1250高精度加法

    具体地,题目涉及到了斐波那契数列的一个变种:F(1)=1, F(2)=1, F(3)=1, F(4)=1, F(n&gt;4)=F(n-1)+F(n-2)+F(n-3)+F(n-4),其中n &gt; 4。这里的关键是要能够计算出F(n)的值,而由于这个序列的增长速度非常快,传统的整数...

    HDU题目java实现

    【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...

    HDU DP动态规划

    例如,一个简单的动态规划问题可以是“斐波那契数列”,其中状态通常定义为第n个斐波那契数,状态转移方程为F(n) = F(n-1) + F(n-2),初始条件为F(0) = 0,F(1) = 1。 在HDU的DP题目中,可能会有各种复杂度的题目,...

    ACM HDU题目分类

    ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中题目的分类,总结了大约十来个分类。这些分类将有助于编程选手更好地理解和解决问题。 DP 问题 DP(Dynamic Programming,动态规划)是一种非常重要...

    HDU-EID-V2-核心板1

    在本话题中,我们关注的是一个名为"HDU-EID-V2-核心板1"的特定设计,它涉及到STM32的核心组件、接口、电源管理和调试配置。 首先,核心板设计中提到了F103和F207两个型号的STM32芯片。F103和F207属于STM32的不同...

    hdu1290解题报告

    ### hdu1290解题报告 #### 题目背景与意义 此题作为对杭州电子科技大学五十周年校庆的献礼,通过一道趣味性的数学问题来庆祝这一重要时刻。题目背景设置在一个充满想象力的情境下,即如何通过不同数量的切刀将一个...

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...

    HDU1059的代码

    HDU1059的代码

    hdu1001解题报告

    hdu1001解题报告

    hdu 1574 passed sorce

    hdu 1574 passed sorce

    ACM hdu 代码大全3000例,部分代码有详细解析

    - 图:邻接矩阵和邻接表是图的常见表示,DFS和BFS遍历算法在解决图问题时尤为重要。 2. 算法篇: - 排序算法:快速排序、归并排序、堆排序、冒泡排序、插入排序等,它们在处理大量数据时有着各自的优势。 - 搜索...

    ACM HDU

    【ACM HDU】指的是在ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)中,参赛者在杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的在线评测系统上完成并已解决的题目集合...

    解题代码 hdu1241

    DFS通常有两种实现方式:递归和非递归。本例中的代码使用了递归的方式。 #### 三、代码分析 ##### 1. 数据结构定义 ```c #include #define N 101 char graph[N][N]; ``` - **`#include&lt;stdio.h&gt;`**:引入标准...

    杭电ACMhdu1163

    【标题】:杭电ACMhdu1163 【描述】:这是一道源自杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的ACM编程竞赛题目,编号为1163。这类问题通常需要参赛者利用计算机编程解决数学、逻辑或算法上的挑战,...

    hdu 1257 最低拦截系统 lis

    题目名为“hdu 1257 最低拦截系统”,这里的“最低拦截系统”实际上是描述了一个问题场景,而具体的问题通过描述部分可以得知是要求找出给定数组中的最长递增子序列的长度。这里所谓的“最低拦截系统”可能是为了...

Global site tag (gtag.js) - Google Analytics