您的位置:首页 > 其它

【海岛帝国系列赛】No.7 海岛帝国:神圣之日

2016-06-22 13:44 267 查看
50237242海岛帝国:神圣之日

【试题描述】

战争持续九个月了。“购物券”WHT的军队还在跟恐怖分子僵持着。WHT和LJX已经向“公务员”告急,情况不宜乐观。YSF为守护帝国决定打开“够累 的”星际仓库来化解恐怖分子的威胁。他和LTJ、WHT、LJX、YSM、LYF等人来到了传说中的星际仓库的防爆门前。“郭同学”TONY,“演 员”KLINT,“美的”STEVE……都被恐怖分子的间谍困在里面。由于情况复杂,恐怖分子在门上加了一层层密码,如果没有顺利答对,“蝴蝶”将会引 爆。整个城市将毁灭。门上有这样一幅图,一排有两个空位,地下散落着N枚“微型机器人”其中编号1,2,3表示TX型号(呵呵呵,大家都知道“州长” 吧)4,5,6表示T-5000型号,每排必须有TX、T-5000型号各一个。当把两个机器人插在一排时,如果这两个机器人互相感应就会亮起红灯。要求 尽量让有感应的机器人插在一起。请问如何摆放,才能让最多的机器人满足条件?

【输入要求】

* 第一行两个正整数N,M,表示有N个机器人,有M个关系道
* 接下来M行:每行两个数A,B表示机器人A和B之间有感应

【输出要求】

* 一行:表示能满足的最大值

【输入实例】

6 5
1 4
1 5
2 5
2 6
3 4

【输出实例】

3

【其他说明】

依旧,
M均小于40
N均小于10

【试题分析】

这里用到了二分图匹配,所以我们先来了解一下,什么是二分图。

简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。

区别二分图,关键是看点集是否能分成两个独立的点集。

#include<iostream>
using namespace std;
int e[101][101];
int match[101];
int book[101];
int n,m;
int dfs(int u)
{
int i;
for(i=1;i<=n;i++)
if(book[i]==0&&e[u][i]==1)
{
book[i]=1;
if(match[i]==0||dfs(match[i]))
{
match[i]=u;
match[u]=i;
return 1;
}
}
return 0;
}
int main()
{
int i,j,t1,t2,sum=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
cin>>t1>>t2;
e[t1][t2]=1;
e[t2][t1]=1;
}
for(i=1;i<=n;i++) match[i]=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++) book[j]=0;
if(dfs(i)) sum++;
}
printf("%d",sum);
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: