首页 > 其他分享 >P5030 题解

P5030 题解

时间:2023-01-22 10:11:54浏览次数:64  
标签:head return int 题解 flow vis P5030 dis

前言

题目传送门!

更好的阅读体验?

一道没啥意思的题目,但是好像很多题解都过不了现在的数据?

思路

只不过是把正常题目的马(\(1, 2\))换成了另一种东西(\(1, 3\))。

很套路地,黑白染色,源点向黑点连边,白点向黑点连边,容量都是 \(1\)。

然后对于两个可以互相到达的点 \((x, y)\) 与 \((dx, dy)\),如果都没有障碍,那么就连容量是 \(1\) 的边。这里的两个点应该保证颜色不同。

答案即为最大独立集。

本题一个比较不同的点在于黑白染色。正常我们都是按 \((x + y)\) 奇偶性看,而这题我们按 \(x\) 的奇偶性看。

代码

为啥很多题解都过不去?因为更新的数据里,障碍的坐标可能有相同的

这个也很容易处理,统计时保证不重复即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int R = 205, N = 114514, inf = 0x7f7f7f7f;
struct Edge {int now, nxt, w;} e[1919810];
int head[N], _head[N], cur = 1;
void ad(int u, int v, int w)
{
    e[++cur].now = v, e[cur].nxt = head[u], e[cur].w = w;
    head[u] = cur;
}
void add(int u, int v, int w) {ad(u, v, w), ad(v, u, 0);}
int s, t;
int dis[N]; bool vis[N];
bool bfs()
{
    queue <int> q;
    memset(vis, false, sizeof vis);
    q.push(s), vis[s] = true, dis[s] = 0, _head[s] = head[s];
    while (!q.empty())
    {
        int u = q.front(); q.pop();
        for (int i = head[u]; i; i = e[i].nxt)
        {
            int v = e[i].now;
            if (vis[v] || !e[i].w) continue;
            vis[v] = true, dis[v] = dis[u] + 1, _head[v] = head[v];
            if (v == t) return true;
            q.push(v);
        }
    }
    return false;
}
int dfs(int u, int maxflow)
{
    if (u == t) return maxflow;
    int flow = 0;
    for (int i = _head[u]; i && flow < maxflow; i = e[i].nxt)
    {
        _head[u] = i;
        int v = e[i].now;
        if (dis[v] != dis[u] + 1 || !e[i].w) continue;
        int ww = dfs(v, min(maxflow - flow, e[i].w));
        if (!ww) dis[v] = -inf;
        e[i].w -= ww, e[i ^ 1].w += ww, flow += ww;
    }
    return flow;
}
int dinic()
{
    int ans = 0, flow;
    while (bfs())
        while (flow = dfs(s, inf))
            ans += flow;
    return ans;
}
int n, m, k; bool a[R][R];
int id(int x, int y) {return (x - 1) * m + y;}
const int dict[8][2] = {{1, 3}, {1, -3}, {-1, 3}, {-1, -3}, {3, 1}, {3, -1}, {-3, 1}, {-3, -1}};
int main()
{
    scanf("%d%d%d", &n, &m, &k);
    s = 0, t = n * m + 1;

    int sum = n * m;
    while (k--)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        if (!a[x][y]) sum--;
        a[x][y] = true;
    }
    for (int x = 1; x <= n; x++)
        for (int y = 1; y <= m; y++)
            if (x & 1) add(s, id(x, y), 1); //按行黑白染色
            else add(id(x, y), t, 1);
    for (int x = 1; x <= n; x++)
        for (int y = 1; y <= m; y++)
            if ((x & 1) && !a[x][y])
                for (int i = 0; i < 8; i++)
                {
                    int dx = x + dict[i][0], dy = y + dict[i][1];
                    if (dx < 1 || dx > n || dy < 1 || dy > m) continue;
                    if (a[dx][dy]) continue;
                    add(id(x, y), id(dx, dy), 1); 
                }
    cout << sum - dinic(); //最大独立集
    return 0;
}

希望能帮助到大家!

标签:head,return,int,题解,flow,vis,P5030,dis
From: https://www.cnblogs.com/liangbowen/p/17064208.html

相关文章

  • 洛谷 P1123 取数游戏 (又是写了好久 最后还是无奈看了题解……)
    对于这个题感觉是一个比较典型的dfs.本题的状态是对于每个数字你可以选也可以不选,但是一旦你选定某个数字之后,他会对其周围的数字产生影响所以一定要标记好(注意这里标记的......
  • AT_abc286d 题解
    板子首先我们看到值域并不大。因此可以维护值域,跑完全背包。具体而言维护某一个值(小于\(10000\))是否能被凑出来,然后枚举物品种类以及物品数量即可。一般而言,完全背包......
  • AT_abc286e 题解
    首先观察到\(n\leq300\)加上全源“最短路”便可以自然而然的想到floyd。注意到floyd算法的可行性只依赖统计的东西具有优先级。这里我们定义优先级为最短路最短且......
  • ABC286 A-E题解
    题目虽然是大年三十,但是玩手机没写题有意思。从50分钟才开始看题。A题意:将数组中\([p,q]\)与\([r,s]\)的元素交换并输出。sbt。B大意:将字符中的na换成nya。......
  • AcWing 第87场周赛题解
    T1移动棋子算出为\(1\)的点离\((3,3)\)的距离即可。#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;intmain(){int......
  • LeetCode.面试题02.05-链表求和-题解分析
    题目来源面试题02.05.链表求和题目详情给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并......
  • Codeforces Round48 Edu题解
    A-DeathNote(模拟)题意​ 现在有一本书,每页可以写下\(m\)个数字,给你一个序列\(a\),依次在书上誊写\(a_i\)个数字,请问誊写序列的第\(i\)个数的时候书翻了几页?​ ......
  • HGAME 2023 Week2 Pwn YukkuriSay题解
    HGAME2023Week2PwnYukkuriSay题解检查保护:拿到文件先checksec一下:64位程序,开启canary和nx保护,没有开启PIE(可以使用绝对地址了)继续往下看,先不着急打开ida,我们先运......
  • GoodBye Renyin ABC题解
    GoodByeRenyinABC题解A答案为\(\text{YES}\)的充要条件是\(\max(a_i)\timesr\le(\suma_i-\max(a_i))\timesR\)。必要性显然。充分性是可以先把最大的放在\((......
  • 博客园美化及markdown代码问题解决
    博客园美化Cnblogs-Theme-SimpleMemory代码出处GitHub-BNDong/Cnblogs-Theme-SimpleMemoryatv1.2.6说明文档:简介-Document(bndong.github.io)如果无法进入网站,......