图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