图1-图的类型
题目描述:
在知道了图是什么样子之后,我们还需要知道图有哪些类型。比赛中常常出现的图的类型有菊花图(即所有点都只和同一个点相连),链图(即所有点形成了一条链),环(即所有点连成了一个环)。给出一张无向图,判断这张图是否是一个琏图或者是菊花图,或者什么都不是
输入格式:
共M+1行。
第1行包含2个正整数N,M,表示有N个点,M条边。
第2~M+1行包含2个用空格隔开的正整数u,v,表示一条从u到v的无向路径。注意,可能会有重边和自环。
输出格式:
如果是链,则输出Chain,如果是菊花图,则输出Flower,如果是环,则输出Ring,否则输出Neither。
样例1输入:
4 3
1 2
3 4
2 3
样例1输出:
Chain
约定:
4≤N,M≤106
用点的度数判断吧。
菊花图:一个点的度数为n-1,其余点的度数为1
链:仅有2个点度数为1,其余均为2
环:每个点度数均为2
#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
set<int>g[N];
bool vis[N];
int n,m,deg[N];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1,x,y;i<=m;++i)
{
scanf("%d%d",&x,&y);
if(x==y)continue;
if(x>y)swap(x,y);
int tmp=g[x].size();
g[x].insert(y);
if(g[x].size()==tmp)continue;
++deg[x];++deg[y];
}
bool flag=true;
for(int i=1;i<=n;++i)
if(deg[i]!=2){flag=false;break;}
if(flag)return puts("Ring"),0;
flag=false;
bool flag2=true;
for(int i=1;i<=n;++i)
if(deg[i]==n-1){flag=true;break;}
else if(deg[i]!=1&°[i]!=n-1)flag2=false;
if(flag&&flag2)return puts("Flower"),0;
int sum=0;flag=true;
for(int i=1;i<=n;++i)
{
if(deg[i]!=1&°[i]!=2){flag=false;break;}
else if(deg[i]==1)++sum;
}
if(flag&&sum==2)return puts("Chain"),0;
return puts("Neither"),0;
}
来源:https://www.cnblogs.com/zzctommy/p/12322039.html