章鱼哥没有女朋友
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 (1≤n≤100,0≤m≤105) 。
接下来 m 行,每一行有两个整数 ui,vi (1≤ui,vi≤n) 表示 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;
}
}