热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SCOI2012奇怪的游戏:结论与网络流应用

本题涉及一些特殊情况,例如黑白块数不相等的情况,这些情况不满足二分性质。对于有解的情况,可以通过特定公式直接计算出结果。本文将详细介绍如何使用网络流来解决这类问题。

在解决这个问题时,我们首先需要处理一些特殊情况,特别是当黑白块数不相等时,这些情况不满足二分性质。在这种情况下,可以直接通过公式计算出最终结果。

具体来说,如果存在解,则必须满足条件:x * cnt1 - ans1 == x * cnt0 - ans0,其中 x 是唯一解。

当黑白块数相等时,上述条件等价于 x = x,因此解的存在性可以通过检查当前 x 是否能够及时分配完成来判断。由于点与点之间的关系复杂,需要使用网络流算法。

需要注意的是,精度控制(eps)的设置非常重要。

以下是具体的代码实现:

#include 
#include 
#include 
#include 
using namespace std;
#define inf 1125899906842624
#define ll long long
queue q;
ll ans1, ans0, cnt1, cnt0, l, r, mid;
ll xia[2000], yuan[2000], tot, zhong[100000], v[1000000], hou[100000], T, n, m, i, j, s, t, d[55][55], dd[2000];

void add_edge(ll a, ll b, ll C) {
    ++tot;
    hou[tot] = yuan[a];
    yuan[a] = tot;
    zhong[tot] = b;
    v[tot] = C;
}

void add(ll a, ll b, ll C) {
    add_edge(a, b, C);
    add_edge(b, a, 0);
}

bool bfs() {
    for (int i = 1; i <= t; i++) {
        xia[i] = yuan[i];
        dd[i] = inf;
    }
    dd[s] = 0;
    q.push(s);
    while (!q.empty()) {
        int st = q.front();
        q.pop();
        for (int i = xia[st]; i != -1; i = hou[i]) {
            int nd = zhong[i];
            if (v[i] > 0 && dd[nd] == inf) {
                dd[nd] = dd[st] + 1;
                q.push(nd);
            }
        }
    }
    return dd[t] != inf;
}

ll dfs(int o, ll limit) {
    if (!limit || o == t) return limit;
    ll f = 0, flow = 0;
    for (int i = xia[o]; i != -1; i = hou[i]) {
        xia[o] = i;
        int nd = zhong[i];
        if (dd[nd] == dd[o] + 1 && (f = dfs(nd, min(limit, v[i])))) {
            flow += f;
            limit -= f;
            v[i] -= f;
            v[i ^ 1] += f;
            if (!limit) break;
        }
    }
    return flow;
}

ll dinic() {
    ll ans = 0;
    while (bfs()) {
        ans += dfs(s, inf);
    }
    return ans;
}

ll work(ll mid) {
    tot = -1;
    memset(yuan, -1, sizeof(yuan));
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if ((i + j) & 1) {
                add(s, (i - 1) * m + j, mid - d[i][j]);
                if (i > 1) add((i - 1) * m + j, (i - 2) * m + j, inf);
                if (j > 1) add((i - 1) * m + j, (i - 1) * m + j - 1, inf);
                if (i = l && work((ans1 - ans0) / (cnt1 - cnt0)) == ((ans1 - ans0) / (cnt1 - cnt0)) * cnt1 - ans1) {
                printf("%lld\n", ((ans1 - ans0) / (cnt1 - cnt0)) * cnt1 - ans1);
            } else {
                printf("-1\n");
            }
        } else {
            if (ans0 != ans1) {
                printf("-1\n");
                continue;
            }
            while (l > 1;
                if (work(mid) == (mid * cnt1 - ans1)) {
                    r = mid;
                } else {
                    l = mid + 1;
                }
            }
            printf("%lld\n", l * cnt1 - ans1);
        }
    }
}

推荐阅读
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
author-avatar
失意的汐_194
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有