2018 FJUT ACM 校赛 G题 第七集:大战赛文斯

2018 FJUT ACM 校赛 G题 第七集:大战赛文斯


第七集:大战赛文斯
TimeLimit:1000MS MemoryLimit:128MB
64-bit integer IO format:%lld
Problem Description
隐藏着黑暗力量的钥匙啊,在我面前显示出真正的力量,跟你订下约定的小A命令你,封印解除!

"天空一声巨响,老子闪亮登场,你的蛤蟆大仙满血复活啦!"

"现在可以带我去小C那儿了吧?" 小A做出一副就你不答应,就要开干的模样

"得嘞,你什么意思,本大仙一言九鼎,说到做到,这就带你过去"

话音刚落,小A就乘着一蹦一蹦的蛤蟆小晋出发了。很快,小A就骑着小晋到达了目的地,然而等待着小A的不是小A心心念念的小C

而是大魔王手下第一大将赛文斯!

"不好,是赛文斯,快跑!" 小晋见势不妙,掉头就想跑

"都到这儿了,我不可能会跑的,即使与全世界为敌,我也要见到小C!" 小A话音刚落,转头一看,小晋已经不见踪影!

"年轻人,摆在你面前的是我和我的军队,打败我们,你就能见到小C,我也不欺负你,摆在你面前的是武器"火爆辣椒",来打败我吧

我已经很久没体会到失败的感觉了!" 赛文斯说到

小A一边思考如何应对,一边观察局势

摆在小A面前的,是一个N*N的战阵,有K名士兵,每个士兵的坐标位置为(xi,yi)。火爆辣椒的作用是可以摧毁一行或者一列的所有士兵

但是火爆辣椒的数量有限,那么至少需要多少"火爆辣椒"呢?

Input
有多组输入,请处理到EOF

每组数据第一行为一个整数N,表示地图大小为NN。(0<N<=100)
接下来一行输入一个整数K,代表有K个士兵,K不大于N
N。
接下来输入K个士兵的坐标,横纵坐标范围[1,N]。

Output
输出最少使用的火爆辣椒数目

SampleInput
3
4
1 1
1 3
2 2
3 2
SampleOutput
2
hint:放(1,2)两颗,则第一发摧毁(1,1)和(1,3),第二发摧毁(2,2)和(3,2)。


【思路】:

该题其实是个水题,学了二分图之后发现就是个模板题,就是求一个二分图的最小覆盖点,又因为有结论,在二分图中最小覆盖点=最大匹配数,所以我们只要按照行列建图后,跑个匈牙利算法,就可以得到答案。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int MAXN = 1005;
vector<int>maps[MAXN];
int line[MAXN];
int person[MAXN];
int n,k;
bool found(int x)
{
    for(int i=0; i<maps[x].size(); i++)
    {
        //printf("....\n");
        int to=maps[x][i];
        //printf("%d\n",to);
        if(line[to]==0)
        {
            line[to]=1;
            if(person[to]==0||found(person[to]))
            {
                person[to]=x;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    while(~scanf("%d%d",&n,&k))
    {memset(person,0,sizeof(person));
        for(int i=0; i<MAXN; i++)
            maps[i].clear();
        for(int i=0; i<k; i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            maps[a].push_back(b);
            //maps[b].push_back(a);
        }
        int sum=0;
        for(int i=1; i<=n; i++)
        {
            memset(line,0,sizeof(line));
            if(found(i))
                sum++;
        }
        printf("%d\n",sum);
    }
    return 0;
}
posted @ 2018-05-31 16:04  moxin0509  阅读(281)  评论(0编辑  收藏  举报