Newcoder 13 D.生物课程(水~)

本文介绍了一种基于图论的细胞类型判别算法,通过分析细胞内无向图的节点度数来判断细胞属于XXX型、YYY型、III型还是无效类型。该算法适用于生物学研究,特别是细胞结构分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

RekiRekiReki是一名武侦高狙击科的学生,武侦高也设有基础学科,现在她正在完成生物课的作业。

给出一张nnn个点mmm条边的无向图,这张无向图描述了一个细胞,细胞有三种:XXX型、YYY型还是III型。

img

如图,虚线方向的链可以无限延伸,现在需要判断给定的图是哪一种细胞,或者都不是。

Input

第一行,两个正整数n,mn,mn,m

接下来mmm行,每行两个正整数u,vu,vu,v描述一条无向边。

(2≤n≤500,0≤m≤n(n−1)2)(2\le n\le 500,0\le m\le \frac{n(n-1)}{2})(2n500,0m2n(n1))

Output

输出这种细胞的类型,若都不是输出NotValidNotValidNotValid

Sample Input

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

Sample Output

X

Solution

XXX型只有一个四度点、四个一度点,其余点都是两度的

YYY型只有一个三度点、三个一度点,其余点都是两度的

III型只有两个一度点,其余点都是两度的

Code

#include<cstdio>
using namespace std;
const int maxn=505;
int n,m,du[maxn],fa[maxn],num[5];
int find(int x)
{
	if(fa[x]==x)return x;
	return fa[x]=find(fa[x]);
}
void unite(int x,int y)
{
	x=find(x),y=find(y);
	if(x==y)return ;
	fa[x]=y;
}
int main()
{
	scanf("%d%d",&n,&m);
	int flag=1;
	for(int i=1;i<=n;i++)fa[i]=i;
	while(m--)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		du[u]++,du[v]++;
		if(find(u)==find(v))flag=0;
		unite(u,v);
	}
	int res=0;
	for(int i=1;i<=n;i++)
	{
		if(fa[i]==i)res++;
		if(du[i]>4)flag=0;
		else num[du[i]]++;
	}
	if(res>1)flag=0;
	if(num[4])
	{
		if(num[4]>1||num[3]||num[1]!=4)flag=0;
		if(flag)printf("X\n");
	}
	else if(num[3])
	{
		if(num[3]>1||num[1]!=3)flag=0;
		if(flag)printf("Y\n");
	}
	else if(flag)printf("I\n");
	if(!flag)printf("NotValid\n");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值