1. 程式人生 > >Newcoder 13 D.生物課程(水~)

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

Description

R e k i Reki 是一名武偵高狙擊科的學生,武偵高也設有基礎學科,現在她正在完成生物課的作業。

給出一張 n

n 個點 m m 條邊的無向圖,這張無向圖描述了一個細胞,細胞有三種: X X 型、 Y
Y
型還是 I I 型。

img

如圖,虛線方向的鏈可以無限延伸,現在需要判斷給定的圖是哪一種細胞,或者都不是。

Input

第一行,兩個正整數 n , m

n,m

接下來 m m 行,每行兩個正整數 u , v u,v 描述一條無向邊。

( 2 n 500 , 0 m n ( n 1 ) 2 ) (2\le n\le 500,0\le m\le \frac{n(n-1)}{2})

Output

輸出這種細胞的型別,若都不是輸出 N o t V a l i d NotValid

Sample Input

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

Sample Output

X

Solution

X X 型只有一個四度點、四個一度點,其餘點都是兩度的

Y Y 型只有一個三度點、三個一度點,其餘點都是兩度的

I I 型只有兩個一度點,其餘點都是兩度的

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;
}