这题是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);
}
}