#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int> ve[10010];
set<int> se;
int t,n,m;
bool ok[10010],book[10010];
int nut,num,res;
void dfs(int d)
{
if(book[d] == 0){
book[d] = 1;
nut += ve[d].size();
}
for(int i = 0; i < ve[d].size(); i++){
se.insert(ve[d][i]);
if(ok[ve[d][i]]){
ok[ve[d][i]]=0;
dfs(ve[d][i]);
}
}
}
int main()
{
cin>>t;
int y=1;
while(t--)
{
int a,b;
cin>>n>>m;
res=num=0;
memset(ok,0,sizeof(ok));
memset(book,0,sizeof(book));
for(int i = 1; i <= m; i++){
cin>>a>>b;
ve[a].push_back(b);
ve[b].push_back(a);
ok[a]=ok[b]=1;
}
for(int i = 1; i <= n; i ++){
if(ok[i]){
res++;
dfs(i);
if(nut > (se.size()-1)*2)
num++;
nut=0,se.clear();
}
}
cout<<"Night sky #"<<y++<<": "<<res<<" constellations, of which "<<num<<" need to be fixed.";
cout<<endl<<endl;
for(int i = 1; i <= n; i ++)
ve[i].clear();
}
return 0;
}
dfs判断连通块,然后判断是否有多少个连通块有环。
最新推荐文章于 2023-01-15 19:32:16 发布