图的类型

时间秒杀一切 提交于 2020-02-17 16:28:39

图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&&deg[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&&deg[i]!=2){flag=false;break;}
        else if(deg[i]==1)++sum;
    }
    if(flag&&sum==2)return puts("Chain"),0;
    return puts("Neither"),0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!