首页 > 其他分享 >Poi2002滑雪者命名

Poi2002滑雪者命名

时间:2024-04-04 17:11:06浏览次数:14  
标签:MCMF int eg 滑雪者 Poi2002 edges 命名 define dis

网络流 #有源汇上下界费用流 #最小点覆盖 #Year2002 #POI

最小点覆盖问题

这里可以直接有源汇上下界费用流

// Author: xiaruize
#ifndef ONLINE_JUDGE
#define debug(x) cerr << "On Line:" << __LINE__ << #x << "=" << x << endl
bool start_of_memory_use;
#else
#define debug(x)
#endif
#include <bits/stdc++.h>
using namespace std;
#ifndef ONLINE_JUDGE
clock_t start_clock = clock();
#endif
#define ull unsigned long long
#define ALL(a) (a).begin(), (a).end()
#define pb push_back
#define mk make_pair
#define pii pair<int, int>
#define pis pair<int, string>
#define sec second
#define fir first
#define sz(a) int((a).size())
#define Yes cout << "Yes" << endl
#define YES cout << "YES" << endl
#define No cout << "No" << endl
#define NO cout << "NO" << endl
#define mms(arr, n) memset(arr, n, sizeof(arr))
#define rep(i, a, n) for (int i = (a); i <= (n); ++i)
#define per(i, n, a) for (int i = (n); i >= (a); --i)
int max(int a, int b)

{
    if (a > b)
        return a;
    return b;
}
int min(int a, int b)
{
    if (a < b)
        return a;
    return b;
}
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
const int N = 2e5 + 10;

namespace MCMF
{
    const int MAXN = 5005, MAXM = 2000005;
    int head[MAXN], cnt = 1;
    struct Edge
    {
        int to, w, c, next;
    } edges[MAXM * 2];
    inline void add(int from, int to, int w, int c)
    {
        edges[++cnt] = {to, w, c, head[from]};
        head[from] = cnt;
    }
    inline void addEdge(int from, int to, int w, int c)
    {
        add(from, to, w, c);
        add(to, from, 0, -c);
    }
    int s, t, dis[MAXN], cur[MAXN];
    bool inq[MAXN], vis[MAXN];
    queue<int> Q;
    bool SPFA()
    {
        while (!Q.empty())
            Q.pop();
        copy(head, head + MAXN, cur);
        fill(dis, dis + MAXN, INF);
        dis[s] = 0;
        Q.push(s);
        while (!Q.empty())
        {
            int p = Q.front();
            Q.pop();
            inq[p] = 0;
            for (int e = head[p]; e != 0; e = edges[e].next)
            {
                int to = edges[e].to, vol = edges[e].w;
                if (vol > 0 && dis[to] > dis[p] + edges[e].c)
                {
                    dis[to] = dis[p] + edges[e].c;
                    if (!inq[to])
                    {
                        Q.push(to);
                        inq[to] = 1;
                    }
                }
            }
        }
        return dis[t] != INF;
    }
    int dfs(int p = s, int flow = INF)
    {
        if (p == t)
            return flow;
        vis[p] = 1;
        int rmn = flow;
        for (int eg = cur[p]; eg && rmn; eg = edges[eg].next)
        {
            cur[p] = eg;
            int to = edges[eg].to, vol = edges[eg].w;
            if (vol > 0 && !vis[to] && dis[to] == dis[p] + edges[eg].c)
            {
                int c = dfs(to, min(vol, rmn));
                rmn -= c;
                edges[eg].w -= c;
                edges[eg ^ 1].w += c;
            }
        }
        vis[p] = 0;
        return flow - rmn;
    }
    int maxflow, mincost;
    inline void run(int s, int t)
    {
        MCMF::s = s, MCMF::t = t;
        while (SPFA())
        {
            int flow = dfs();
            maxflow += flow;
            mincost += dis[t] * flow;
        }
    }
} // namespace MCMF

int n;
int deg[N];

void solve()
{
    cin >> n;
    rep(i, 1, n)
    {
        MCMF::addEdge(0, i, INF, 1);
        MCMF::addEdge(i, n + 1, INF, 0);
        int x;
        cin >> x;
        rep(j, 1, x)
        {
            int y;
            cin >> y;
            deg[i]--;
            deg[y]++;
            MCMF::addEdge(i, y, INF, 0);
        }
    }
    MCMF::addEdge(n + 1, 0, INF, 0);
    rep(i, 1, n)
    {
        if (deg[i] > 0)
            MCMF::addEdge(n + 2, i, deg[i], 0);
        else
            MCMF::addEdge(i, n + 3, -deg[i], 0);
    }
    MCMF::run(n + 2, n + 3);
    cout << MCMF::mincost << endl;
}

signed main()
{
    // freopen(".in","r",stdin);
    // freopen(".out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int testcase = 1;
    // cin >> testcase;
    while (testcase--)
        solve();
#ifndef ONLINE_JUDGE
    bool end_of_memory_use;
    cerr << "Memory use:" << (&end_of_memory_use - &start_of_memory_use) / 1024.0 / 1024.0 << "MiB" << endl;
    cerr << "Time use:" << (double)(clock() - start_clock) / CLOCKS_PER_SEC * 1000.0 << "ms" << endl;
#endif
    return 0;
}

标签:MCMF,int,eg,滑雪者,Poi2002,edges,命名,define,dis
From: https://www.cnblogs.com/xiaruize/p/18114348

相关文章

  • Poi2002滑雪者命名
    网络流#有源汇上下界费用流#最小点覆盖最小点覆盖问题这里可以直接有源汇上下界费用流//Author:xiaruize#ifndefONLINE_JUDGE#definedebug(x)cerr<<"OnLine:"<<__LINE__<<#x<<"="<<x<<endlboolstart_of_memory_use;#else#defi......
  • Python命名规范
    ★类属性命名规范类属性通常采用大写字母、下划线分隔的方式命名,遵循以下规范:1.如果类属性是常量,通常使用全大写的字母表示,多个单词之间用下划线分隔,例如:MAX_SIZE。2.如果类属性表示一个布尔值或状态,通常使用is或has开头,例如:is_running、has_finished。3.如果类属性表示......
  • C++命名空间详解
    在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。#include<st......
  • Poi2002滑雪者命名
    网络流#有源汇上下界费用流#最小点覆盖最小点覆盖问题这里可以直接有源汇上下界费用流//Author:xiaruize#ifndefONLINE_JUDGE#definedebug(x)cerr<<"OnLine:"<<__LINE__<<#x<<"="<<x<<endlboolstart_of_memory_use;#else#defi......
  • 批量文件重命名的方法
    工具软件下载http://6laohu.com/使用介绍下载 批量文件重命名软件 无需安装直接运行,按界面上操作步骤可将指定目录下的所有文件按照配置的规则批量重命名,并把重命名后的文件复制到指定目录下(原文件不会删除,您不用了可以自己删),防泄密软件,可离线断网使用 ......
  • macOS 磁盘设备文件命名规则
    macOS系统使用不同于Linux的磁盘设备命名规则。在macOS中,磁盘设备和分区被命名并通过/dev目录访问,类似于Linux和UNIX系统。但是,macOS的命名规则遵循特定的模式。macOS磁盘设备命名概述:1.主磁盘设备在macOS中,主磁盘通常被命名为/dev/disk0。这个设备是你的主启......
  • Eclipse重命名Maven工程,经常报错
    0.问题重命名Maven工程方式如下:重命名Maven工程时,发生报错:1.解决问题大概率是,重命名后无法读取到相应工程下的pom.xml了所以我们需要实时更新Maven配置,如下配置,勾选如图选项即可:......
  • 思科、华为、H3C交换机命名规则
    01思科交换机命名规则思科C9200L-48T-4G-E交换机Cisco交换机名称总体上可以划分为七个部分,为了方便,我们用A、B、C、D、E、F、G这七个字母来表示它们。它们与Cisco以太网交换机产品名称之中各部分的对应关系如下图所示(以WSC3750G24TSE这个型号交换机为例进行介绍)。Ci......
  • Java(匿名对象和命名对象)——进一步了解对象
    1.前面已知,想要抽象出一个对象,首先要写好它的模板——类但是存在一个问题,我们想创建一个对象,要用构造方法去初始化这个对象。但是如果我们只想在某个时候只使用这个对象一次,之后就不要用了,那是不是这个对象就会占我们的内存,就像我们借走别人的笔(这个对象),之后要还给别人。所以......
  • 编程语言|C语言——C语言标识符的命名规则
    1.标识符简介在计算机高级语言中,用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符。标识符可以简单认为是一个名字,用来标识变量名、常量名、函数名及数组等。变量名a、b、c,符号常量名PI、Pai,函数名printf、scanf等都是标识符。2.标识符命名规......