foj Problem 2232 炉石传说 福州大学第十三届程序设计竞赛_重现 二分图

原创 2016年05月30日 15:55:31

题意:有两组士兵,分别为a和b,一对一互相攻打,每个士兵的生命值等于对方的攻击值减掉自己的生命值,问能否在a组士兵全部存活的情况下,b组全部阵亡


思路:比赛时没做出来,后来听到队长说是简单的二分图,就补了这方面的知识,对于a每一个士兵,在b中找到所有他能杀死别人且自己不死的士兵,这两者建一条从a->b的边,

就是求最大匹配数目是否达到n,如果达到,输出Yes,否则输出No, solve里的代码可以当做求最大匹配数的dfs模板


题目链接:http://acm.fzu.edu.cn/problem.php?pid=2232


#include <cstdio>
#include <cstring>
#include <algorithm>

#pragma warning (disable: 4996)

using namespace std;

const int maxn = 1005;
const int maxm = 10005;

struct edge
{
	int u, v, next;
}e[maxm];
int head[maxn];
bool vis[maxn];
int n, cnt;
int a[maxn], b[maxn], c[maxn], d[maxn];
int from[maxn];

void init()
{
	cnt = 0;
	memset(head, -1, sizeof(head));
	memset(from, -1, sizeof(from));
	memset(vis, false, sizeof(vis));
}

void addedge(int u, int v)
{
	e[cnt].u = u, e[cnt].v = v, e[cnt].next = head[u], head[u] = cnt++;
}

bool dfs(int u)
{
	int v;
	for (int i = head[u]; i !=- 1; i = e[i].next)
	{
		v = e[i].v;
		if (!vis[v])
		{
			vis[v] = true;
			if (from[v] == -1 || dfs(from[v]))
			{
				from[v] = u;
				return true;
			}
		}
	}
	return false;
}

void solve()
{
	bool flag = true;
	for (int i = 1; i <= n; i++)
	{
		memset(vis, false, sizeof(vis));
		if (!dfs(i))
		{
			flag = false;
			puts("No");
			break;
		}
	}
	if (flag)
		puts("Yes");
}

void build()
{
	for (int i = 1; i <= n ; i++)
	{
  		for (int j = 1; j <= n; j++)
		{
			if (b[i] >= c[j] && a[i] > d[j])
				addedge(i, j + n);
		}
	}
}

void read()
{
	int ret1 = 1, ret2 = 1;
	scanf("%d", &n);//注意下输入
	for (int i = 1; i <= n * 2; i++)
	{
		if (i & 1)
			scanf("%d", &a[ret1++]);
		else
			scanf("%d", &b[ret2++]);
	}
	ret1 = ret2 = 1;
	for (int i = 1; i <= n * 2; i++)
	{
		if (i & 1)
			scanf("%d", &c[ret1++]);
		else
			scanf("%d", &d[ret2++]);
	}
}

int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		init();
		read();//读入数据
		build();//建边
		solve();//求最大匹配
	}
	return 0;
}


版权声明:转载务必请标明出处,谢谢 举报

相关文章推荐

foj Problem 2232 炉石传说 福州大学第十三届程序设计竞赛_重现 二分图

题意:有两组士兵,分别为a和b,一对一互相攻打,每个士兵的生命值等于对方的攻击值减掉自己的生命值,问能否在a组士兵全部存活的情况下,b组全部阵亡 思路:比赛时没做出来,后来听到队长说是简答的二分图...

福州大学第十二届程序设计竞赛-G - Escape

福州大学第十二届程序设计竞赛

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

福州大学第十三届程序设计竞赛_重现解题报告

福州大学第十三届程序设计竞赛_重现解题报告

福州大学第十一届程序设计竞赛

福州大学第十一届程序设计竞赛 Contest Finished! Tag Pro.ID Problem Title Ratio(AC/Submit) 1 大王...

福州大学第十一届程序设计竞赛

Problem A 大王叫我来巡山呐

福州大学第十三届程序设计竞赛题解【8/9】

整套整套切的时候,还是写一发总结比较好的样子。 Acm强校的校赛感觉拿出来再修改修改添加添加可以当省赛打打。 题目位子:FZU 2229~2237 A.水题。 B.简单...

福州大学第十二届程序设计竞赛-F - 检查站点

福州大学第十二届程序设计竞赛

福州大学第十二届程序设计竞赛 (部分题解)

福州大学第十二届程序设计竞赛 (部分题解)

福州大学第十二届程序设计竞赛-H - 最小花费

福州大学第十二届程序设计竞赛

福州大学第十届程序设计竞赛+Problem C 数字的孔数

Problem C 数字的孔数 Accept: 220    Submit: 253 Time Limit: 1000 mSec    Memory Limit : 32768 KB ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)