qb基础班 graphchecker

这里写图片描述这里写图片描述这里写图片描述这里写图片描述
这题是qx寒假基础班的试题
就当做是图论概念的基础题吧
判连通判树判自环都比较简单
就是重边是个好东西
当时用set维护,全TLE了……
然后看到老师的std,存到vector里面就可以了……
不过……老师的std好像也会t两个点……自己卡死自己了?
下面上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
vector<int>v[50004];
int fa[50004],n,t,m,cnt;
bool shu,zi,chong,lian;
int fin(int x)
{
    if(x==fa[x])
    return x;
    else
    return fa[x]=fin(fa[x]);
}
int main()
{
    cin>>t;
    while(t--)
    {
        scanf("%d %d",&n,&m);
        cnt=n;
        for(int i=1;i<=n;i++)
        {
            fa[i]=i;
        }
        shu=zi=chong=lian=false;
        for(int i=0;i<50003;i++)
        {
            if(!v[i].empty())
            v[i].clear();
        }
        for(int i=1;i<=m;i++)
        {
            int u,vv;
            scanf("%d %d",&u,&vv);
            v[u].push_back(vv);
            if(u==vv)
            {
                zi=true;
            }
            else
            {
                v[vv].push_back(u);
            }
            int a=fin(u);
            int b=fin(vv);
            if(a!=b)
            {
                fa[a]=b;
                cnt--;
            }
        }
        for(int i=0;i<=n&&!chong;i++)//就这里当时不会,原来可以存在vector里排一下序,然后有重复就是重边……好办法
        {
            sort(v[i].begin(),v[i].end());
            for(int j=1;j<v[i].size()&&!chong;j++)
            {
                if(v[i][j]==v[i][j-1])chong=true;
            }
        }
        printf("%d %d %d %d\n",int(m==n-1&&cnt==1),zi,chong,cnt==1);
    }
} 

猜你喜欢

转载自blog.csdn.net/qq_37073764/article/details/82737735