版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/V5ZSQ/article/details/83618294
Description
是一名武侦高狙击科的学生,武侦高也设有基础学科,现在她正在完成生物课的作业。
给出一张 个点 条边的无向图,这张无向图描述了一个细胞,细胞有三种: 型、 型还是 型。
如图,虚线方向的链可以无限延伸,现在需要判断给定的图是哪一种细胞,或者都不是。
Input
第一行,两个正整数 。
接下来 行,每行两个正整数 描述一条无向边。
Output
输出这种细胞的类型,若都不是输出 。
Sample Input
7 6
1 2
1 3
1 4
1 5
5 6
6 7
Sample Output
X
Solution
型只有一个四度点、四个一度点,其余点都是两度的
型只有一个三度点、三个一度点,其余点都是两度的
型只有两个一度点,其余点都是两度的
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;
}