2018ACM-ICPC亚洲区域赛南京站I题Magic Potion(网络流)

http://codeforces.com/gym/101981/attachments

题意:有n个英雄,m个敌人,k瓶药剂,给出每个英雄可以消灭的敌人的编号。每个英雄只能消灭一个敌人,但每个英雄只能消灭一个敌人。现在有药剂,英雄喝了之后可以多消灭一个敌人,但每个英雄只能喝一瓶,问最多能消灭多少个敌人。

下午在实验室队内自己开训练,和JC大佬那队一起开的,当时JC大佬他们队开的J题,没有看I题,当我们队AC之后JC大佬才看了I题,听到他们说,这题就差直接把网络流三个字写在题目里了。确实非常明显,很明显的一个匹配问题,如果每个英雄只能消灭一个敌人的话就是二分图匹配网络流裸题。刚开始建图错误,建成了这样。

1

直接把s和s2直接连了一条n+k的边,s2和n个英雄直接建了一条边权为2的边,然后WA了一发。后面发现,有部分英雄如果没有消灭敌人,可能会被当成药剂给别的英雄。

然后找到了正确建图方式,就是这样

将药剂和每个英雄的攻击一次分离。在这张图上直接跑最大流就可以了。

最后贴上AC代码

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int,int> pii;
#define rep(i,x,y) for(int i=x;i<y;i++)
#define rept(i,x,y) for(int i=x;i<=y;i++)
#define per(i,x,y) for(int i=x;i>=y;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define de(x) cout<< #x<<" = "<<x<<endl
#define dd(x) cout<< #x<<" = "<<x<<" "
#define mes(a,b) memset(a,b,sizeof a)
const ll inf= 1e18;
const int N=2005,M=1e6;
int head[N],ver[M],edge[M],Next[M],d[N];
int n,m,s,t,tot,maxflow;
queue<int>q;

void add(int x,int y,int z)
{
    ver[++tot]=y,edge[tot]=z,Next[tot]=head[x],head[x]=tot;
    ver[++tot]=x,edge[tot]=0,Next[tot]=head[y],head[y]=tot;
}
bool bfs()
{
    mes(d,0);
    while(!q.empty()) q.pop();
    q.push(s);
    d[s]=1;
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        for(int i=head[x];i;i=Next[i])
        {
            if(edge[i]&&!d[ver[i]])
            {
                q.push(ver[i]);
                d[ver[i]]=d[x]+1;
                if(ver[i]==t) return 1;
            }
        }
    }
    return 0;
}
int dinic(int x,ll flow)
{
    if(x==t) return flow;
    int rest=flow,k;
    for(int i=head[x];i&&rest;i=Next[i])
    {
        if(edge[i]&&d[ver[i]]==d[x]+1)
        {
            k=dinic(ver[i],min(rest,edge[i]));
            if(!k) d[ver[i]]=0;
            edge[i]-=k;
            edge[i^1]+=k;
            rest-=k;
        }
    }
    return flow-rest;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    tot=1;
    int n,m,k;
    cin>>n>>m>>k;
    s=0;
    t=n+m+1;
    int s1=n+m+2,s2=n+m+3;
    rept(i,1,n)
    {
        int cnt;
        cin>>cnt;
        rept(j,1,cnt)
        {
            int y;
            cin>>y;
            add(i,n+y,1);
        }
    }
    add(s,s1,n);
    add(s,s2,k);
    rept(i,1,n) add(s1,i,1),add(s2,i,1);
    rept(i,1,m) add(n+i,t,1);
    int flow=0;
    while(bfs())
        while(flow=dinic(s,inf)) maxflow+=flow;
    cout<<maxflow<<"\n";
    return 0;
}

原文地址:https://www.cnblogs.com/FZUzyz/p/11668929.html

时间: 2024-11-02 22:07:24

2018ACM-ICPC亚洲区域赛南京站I题Magic Potion(网络流)的相关文章

2013 ACM-ICPC亚洲区域赛南京站C题 题解 轮廓线DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4804 题目大意 给你一个 \(n \times m\) 的矩形区域.你需要用 \(1 \times 1\) 和 \(1 \times 2\) 的砖块铺满这个区域,且满足如下要求: 所有的砖块可以竖着放或横着放: 砖角要放在格点上: \(1 \times 1\) 的砖不能少于 \(C\) 块也不能多于 \(D\) 块, \(1 \times 2\) 的砖没有数量限制. 有些方格在一开始就已经被填充了,

2014ACM/ICPC亚洲区域赛牡丹江站总结

我在集训队里面也就一般水平,这次学校史无前例的拿到了8个名额,由于大三的只有两个队伍,所以我们13及能分到名额,由于13及人数很多,组长就按照谁在oj上面a的题多就让谁去,我和tyh,sxk,doubleq幸运的在大二就有机会参加亚洲现场赛,非常激动.牡丹江赛区是我和sxk和doubleq组成rainbow战队,我们对这次区域赛其实就是去张张见识,增加大赛经验(外加公费旅游2333),可是当我们真正来到赛场的时候不知道为上面我非常渴望拿一块牌子.第一天热身赛,double迅速切下水题,我一直再弄

2014ACM/ICPC亚洲区域赛牡丹江站汇总

球队内线我也总水平,这所学校得到了前所未有的8地方,因为只有两个少年队.因此,我们13并且可以被分配到的地方,因为13和非常大的数目.据领队谁oj在之上a谁去让更多的冠军.我和tyh,sxk,doubleq运的在大二就有机会參加亚洲现场赛,非常激动.牡丹江赛区是我和sxk和doubleq组成rainbow战队,我们对这次区域赛事实上就是去张张见识,添加大赛经验(外加公费旅游2333),但是当我们真正来到赛场的时候不知道为上面我非常渴望拿一块牌子. 第一天热身赛,double迅速切下水题.我一直再

2014ACM/ICPC亚洲区域赛牡丹江站现场赛-A ( ZOJ 3819 ) Average Score

Average Score Time Limit: 2 Seconds      Memory Limit: 65536 KB Bob is a freshman in Marjar University. He is clever and diligent. However, he is not good at math, especially in Mathematical Analysis. After a mid-term exam, Bob was anxious about his

ICPC2019 亚洲区域赛 南京站

蒟蒻终于打完了人生的第一场ICPC了. 终榜去星后rank36,AG,和AU差几十罚时了. 虽有遗憾但总体也是正常发挥了. 不愿再去对比赛做什么回顾,甚至很不愿去想.很多题已经在能力之外,即便是平常熟练的东西码量也些大就跪了吧. 希望能不忘初心 希望能向第一次走进这个世界那样走下去 希望能守护这份热忱与挚爱 希望我们能一直走下去 原文地址:https://www.cnblogs.com/mollnn/p/11749139.html

2014ACM/ICPC亚洲区域赛牡丹江站现场赛-I ( ZOJ 3827 ) Information Entropy

Information Entropy Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge Information Theory is one of the most popular courses in Marjar University. In this course, there is an important chapter about information entropy. Entropy is t

2014ACM/ICPC亚洲区域赛牡丹江站D和K题

Known Notation Time Limit: 2 Seconds      Memory Limit: 131072 KB Do you know reverse Polish notation (RPN)? It is a known notation in the area of mathematics and computer science. It is also known as postfix notation since every operator in an expre

2014ACM/ICPC亚洲区域赛牡丹江站现场赛-K ( ZOJ 3829 ) Known Notation

Known Notation Time Limit: 2 Seconds      Memory Limit: 65536 KB Do you know reverse Polish notation (RPN)? It is a known notation in the area of mathematics and computer science. It is also known as postfix notation since every operator in an expres

【2018 ICPC亚洲区域赛沈阳站 L】Tree(思维+dfs)

Problem Description Consider a un-rooted tree T which is not the biological significance of tree or plant, but a tree as an undirected graph in graph theory with n nodes, labelled from 1 to n. If you cannot understand the concept of a tree here, plea