「游族杯」上海市高校程序设计邀请赛暨华东师范大学第九届 ECNU Coder 程序设计竞赛 E.章鱼哥没有女朋友

15 篇文章 0 订阅

章鱼哥没有女朋友

Time limit per test: 1.0 seconds

Time limit all tests: 1.0 seconds

Memory limit: 256 megabytes

章鱼哥要送给他的女朋友一条项链,但他长期打 ACM 已经分辨不出什么是项链了,所以想请你帮帮他。

在章鱼哥眼中,他所买的东西就是个  n  个点和  m  条边构成的无向图(……)。判断这个图是不是项链,我们要做以下三件事情:

  • 首先我们要在图上找一个环。而且我们要保证在图上只能找到这一个环。
  • 环上可以长出一些树,这些树的根都在环上。树应该由至少一个节点组成,但为了美观起见,应该要能找到至少  3  棵树。
  • 重边和自环是不允许出现的。不然女孩子有可能不小心把头伸进里面,然后出不来……

如果满足以上三个条件,章鱼哥就会非常高兴,并大叫一声 Bingo。否则,他的女朋友就会和他分手……

Input

输入数据包含多个测试文件,每个测试文件包含一个测试点。

第一行,给出  n,m   (1n100,0m105)

接下来  m  行,每一行有两个整数  ui,vi   (1ui,vin)  表示  ui  和  vi  之间有边相连。可能存在重边和自环。

Output

如果是项链则输出 Bingo,否则输出 Break up

Examples

input
6 6
6 3
6 4
5 1
2 5
1 4
5 4
output
Bingo
input
6 5
5 6
4 6
3 1
5 1
1 2
output
Break up

Source

2017 华东师范大学校赛
解题思路:这道题我们可以检查所给的图中有多少个联通块,根据然后判断联通块是否符合条件,这道题最巧的一个点是要判一下给的n和m的关系,要是n!=m,说明这个图中不存在环或者有多个环也就不符合条件,之后判断是否在满足n==m的情况下,是否有重边和自环的情况,之后判断是否存在唯一一个环上存在至少三个点的环,如果存在即是项链,如果不存在就不是

#include<iostream>    
#include<cstdio>  
#include<stdio.h>  
#include<cstring>    
#include<cstdio>    
#include<climits>    
#include<cmath>   
#include<vector>  
#include <bitset>  
#include<algorithm>    
#include <queue>  
#include<map>  
using namespace std;

struct XL
{
	int n,m,k;
}xl[100005];
int ans,sum,n,m,flag;
vector<int> tu[105];
long long int a[105][105],b[105];
long long int check[105],vis[105];
void dfs(int x)
{
	for(int i=0;i<tu[x].size();i++)
	{
		if(!vis[tu[x][i]])
		{
			vis[tu[x][i]]=1;
			check[tu[x][i]]=ans;
			dfs(tu[x][i]);
		}
	}
}
bool dfss(int x,int y)
{
	if(b[x]==1)
		sum++;
	if(xl[y].n-sum<3)
		return false;
	for(int i=0;i<tu[x].size();i++)
	{
		if(!vis[tu[x][i]])
		{
			int k=tu[x][i];
			vis[k]=1;
			if(!dfss(k,y))
				return false;
		}
	}
	return true;
}

int main()
{
	int x,y,i;
	memset(xl,0,sizeof(xl));
	memset(a,0,sizeof(a));
	cin>>n>>m;
	for(i=1;i<=m;i++)
	{
		cin>>x>>y;
		if(a[x][y]==0)
		{
			tu[x].push_back(y);
			tu[y].push_back(x);
		}
		a[x][y]++;
		a[y][x]++;
		b[x]++;
		b[y]++;
	}
	int j;
	if(n!=m||n<3)
	{
		cout<<"Break up"<<endl;
		return 0;
	}
	vis[xl[i].k]=1;
/*	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			if(i==j&&a[i][j]!=0||a[i][j]>=2)
			{
				cout<<"Break up"<<endl;
				return 0;
			}
		}
	}*/
	memset(vis,0,sizeof(vis));
	memset(check,0,sizeof(check));
	ans=0;
	for(i=1;i<=n;i++)
	{
		if(!vis[i])
		{
			vis[i]=1;
			ans++;
			check[i]=ans;
			dfs(i);
		}
	}	
	for(i=1;i<=n;i++)
	{
		int k=check[i];
		xl[k].n++;
		for(j=1;j<=n;j++)
		{
			xl[k].m+=a[i][j];
		}
		xl[k].k=i;
	}
	flag=0;
	for(i=1;i<=ans;i++)
	{
		if(xl[i].n==xl[i].m/2&&xl[i].n>=3)
		{
			sum=0;
			memset(vis,0,sizeof(vis));
			vis[xl[i].k]=1;
			if(dfss(xl[i].k,i))
			{
				flag++;
			}
		}
	}
	if(flag==1)
	{
		cout<<"Bingo"<<endl;
	}
	else
	{
		cout<<"Break up"<<endl;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值