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;
}


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

二分图(挑战程序设计竞赛)

#include #include #include #include #include using namespace std; #define maxn 10001 int V,E;//顶点数,边...
  • qq_32426313
  • qq_32426313
  • 2016年09月04日 15:41
  • 185

判断一个无向图是否为二分图

要求:先设计算法,然后用程序实现。程序可允许输入一个无向图,然后自动判断是否为二分图 注:一个图G=(V,E)是二分图如果存在V的一个划分V= XY,其中XY=空集。 话不多说,直接上代码...
  • jeanFlower
  • jeanFlower
  • 2016年11月19日 13:26
  • 1509

二分图判定

给定一个具有n个顶点的图,要给图上每个顶点染色,并且要使相邻的顶点颜色不同。问是否能最多用2种颜色进行染色?题目保证没有重边和自环。vector G[maxn]; //图 int V; ...
  • a2459956664
  • a2459956664
  • 2016年04月05日 16:28
  • 471

二分图一•二分图判定

萌萌哒的传送门 题目讲的是如何在一堆相亲的名单中找出有错误的地方,如两个同性的被安排相亲; 因为相亲的两个人必定是异性,所以题目可以转化为黑白染色问题. 何为黑白染色问题...........
  • ZSGG_ACM
  • ZSGG_ACM
  • 2015年02月14日 22:48
  • 1190

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

Problem C 平行四边形数 Accept: 71    Submit: 345 Time Limit: 2000 mSec    Memory Limit : 32768 KB  ...
  • leibniz_zhang
  • leibniz_zhang
  • 2016年05月02日 16:28
  • 507

【福州大学第十三届程序设计竞赛_重现】D - 炉石传说(二分图最大匹配)

Problem D 炉石传说 Accept: 47    Submit: 224 Time Limit: 1000 mSec    Memory Limit : 32768 KB  ...
  • wyg1997
  • wyg1997
  • 2016年05月02日 16:29
  • 412

poj1064 二分搜索 挑战程序设计竞赛

2018-2-5 直接二分搜索即可,最小值为0,最大值为inf,设置100次的循环,可以把精度范围缩小到10^-30大小。 但是这里存在一个问题,在输出的时候,如果我们用的是 %.2lf 输出的话...
  • qq_34600424
  • qq_34600424
  • 2018年02月05日 18:47
  • 19

二分图判定

题意:给定顶点数和边数的无向图,判定其是否为二分图。   思路:首先需要知道一个图是二分图并不代表其实联通的,那么遍历每个顶点,对其进行染色,并处理与之相邻的顶点,若无色,则染成与之相反的颜色,若有...
  • jinjiahao5299
  • jinjiahao5299
  • 2015年03月07日 20:24
  • 242

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

福州大学第十三届程序设计竞赛_重现解题报告
  • queuelovestack
  • queuelovestack
  • 2016年05月02日 17:32
  • 4512

福州大学第十三届程序设计竞赛_重现总结

Problem C 平行四边形数 Accept: 82    Submit: 425 Time Limit: 2000 mSec    Memory Limit : 32768 KB ...
  • acm_fighting
  • acm_fighting
  • 2016年05月05日 16:45
  • 2940
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:foj Problem 2232 炉石传说 福州大学第十三届程序设计竞赛_重现 二分图
举报原因:
原因补充:

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