【BZOJ 1191】[HNOI2006]超级英雄Hero(二分图匹配/枚举)

本文介绍了一种使用最大流算法解决有奖问答节目中的策略问题,旨在找到通过最多题目的策略。通过构建一个包含问题和锦囊的二分图,并利用Dinic最大流算法,文章详细阐述了如何在有限的锦囊条件下,最大化正确回答的问题数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题面

题意:

一个有奖问答节目,有 n n n个问题, m m m个锦囊。每道题你可以在某两个锦囊之间选择一个使该题通过。假设你一道题不会。在回答过程中如果错误则游戏结束。求最多通过几道题。

IDEA:

我们枚举回答的最后一个问题 i i i,每次从问题 1 − i 1-i 1i匹配对应的锦囊。如果满足完美匹配则继续。否则输出答案。

code:

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long ll;

//Dinic最大流, 节点编号从0开始 
struct MaxFlow{
    const static ll MAX_V = 2010;
    ll V;
    //终点、容量、反向边 
    struct edge{
        ll to, cap, rev;
    };
    vector<edge> G[MAX_V];
    ll level[MAX_V];//顶点到源点的距离标号 
    ll iter[MAX_V];// 当前弧,在其之前的边已经没有用了

    void add_edge(ll from, ll to, ll cap){
        G[from].push_back((edge){to, cap, (ll)G[to].size()});
        G[to].push_back((edge){from, 0, (ll)G[from].size()-1});
    } 

    // 通过BFS计算从源点出发的距离标号 
    void bfs(ll s){
        fill(level, level + V, -1);
        queue<ll> que;
        level[s] = 0;
        que.push(s);
        while (!que.empty()){
            ll v = que.front();
            que.pop();
            for (ll i=0; i< G[v].size(); i++){
                edge& e = G[v][i];
                if (e.cap > 0 && level[e.to] < 0){
                    level[e.to] = level[v] + 1;
                    que.push(e.to);
                }
            }
        }
    }

    //通过DFS寻找增广路 
    ll dfs(ll v, ll t, ll f){
        if (v == t)
            return f;
        for (ll &i = iter[v]; i < G[v].size(); i++){
            edge& e = G[v][i];
            if (e.cap > 0 && level[v] < level[e.to]){
                ll d = dfs(e.to, t, min(f, e.cap));
                if (d > 0){
                    e.cap -= d;
                    G[e.to][e.rev].cap += d;
                    return d;
                }
            }
        }
        return 0;
    }

    //求解从s到t的最大流 
    ll max_flow(ll s, ll t){
        ll flow = 0;
        for (;;){
            bfs(s);
            if(level[t] < 0)
                return flow;
            fill(iter, iter + V, 0);
            ll f;
            while ((f = dfs(s, t, INF)) > 0){
                flow += f;
            }
        }
    }

    void init(ll n = 0){
        for (ll i = 0; i < V; i++){
            G[i].clear();
        }
        V = n;
    }
}mf;
int u[2000];int v[2000];
int main(){
    int n,m;
    cin>>n>>m;
    mf.init();
    mf.V=n+m+2;
    for(int i=1;i<=m;i++) cin>>u[i]>>v[i];
    int ans=0;
    for(int i=1;i<=m;i++){
        mf.init();
        mf.V=n+m+2;
        for(int j=1;j<=m;j++){
             mf.add_edge(0,j,1);
             mf.add_edge(j,0,0);
         }
         for(int j=m+1;j<=m+n;j++){
             mf.add_edge(j,m+n+1,1);
             mf.add_edge(m+n+1,j,0);
         }
        for(int j=1;j<=i;j++){
         mf.add_edge(j,u[j]+m+1,1);
         mf.add_edge(u[j]+m+1,j,0);
         mf.add_edge(j,v[j]+m+1,1);
         mf.add_edge(v[j]+m+1,j,0);
        }
        int res=mf.max_flow(0,n+m+1);
        if(res==i) ans=i;
        else break;
    }
    cout<<ans<<endl;
    return 0;
}
资源下载链接为: https://pan.quark.cn/s/9648a1f24758 这个HTML文件是一个专门设计的网页,适合在告白或纪念日这样的特殊时刻送给女朋友,给她带来惊喜。它通过HTML技术,将普通文字转化为富有情感和创意的表达方式,让数字媒体也能传递深情。HTML(HyperText Markup Language)是构建网页的基础语言,通过标签描述网页结构和内容,让浏览器正确展示页面。在这个特效网页中,开发者可能使用了HTML5的新特性,比如音频、视频、Canvas画布或WebGL图形,来提升视觉效果和交互体验。 原本这个文件可能是基于ASP.NET技术构建的,其扩展名是“.aspx”。ASP.NET是微软开发的一个服务器端Web应用程序框架,支持多种编程语言(如C#或VB.NET)来编写动态网页。但为了在本地直接运行,不依赖服务器,开发者将其转换为纯静态的HTML格式,只需浏览器即可打开查看。 在使用这个HTML特效页时,建议使用Internet Explorer(IE)浏览器,因为一些老的或特定的网页特效可能只在IE上表现正常,尤其是那些依赖ActiveX控件或IE特有功能的页面。不过,由于IE逐渐被淘汰,现代网页可能不再对其进行优化,因此在其他现代浏览器上运行可能会出现问题。 压缩包内的文件“yangyisen0713-7561403-biaobai(html版本)_1598430618”是经过压缩的HTML文件,可能包含图片、CSS样式表和JavaScript脚本等资源。用户需要先解压,然后在浏览器中打开HTML文件,就能看到预设的告白或纪念日特效。 这个项目展示了HTML作为动态和互动内容载体的强大能力,也提醒我们,尽管技术在进步,但有时复古的方式(如使用IE浏览器)仍能唤起怀旧之情。在准备类似的个性化礼物时,掌握基本的HTML和网页制作技巧非常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值