#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#include<ext/rope>
#include<ext/hash_map>
#include<ext/hash_set>
#include<parallel/algorithm>
#include<ext/pb_ds/assoc_container.hpp>
#include<x86intrin.h>
#include<cpuid.h>
//#define ATCODER_LOCAL
#ifdef ATCODER_LOCAL
#include<atcoder/all>
using namespace atcoder;
#endif
//#define CF_AT
#ifdef CF_AT
#pragma GCC optimize("O3,unroll-loops")
#endif
#define vc vector
#define tp tuple
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
#define __THE_END__by_NR__ string Nightwatch_ryan="I love string and vector"
using ll=long long;
using ull=unsigned long long;
using db=double;
using str=string;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
using puu=pair<ull,ull>;
using pdb=pair<db,db>;
using vi=vc<int>;
using vl=vc<ll>;
using vu=vc<ull>;
using vdb=vc<db>;
using tpi=tp<int>;
using tpl=tp<ll>;
using tpu=tp<ull>;
using tpdb=tp<db>;
using pri=priority_queue<int>;
using prl=priority_queue<ll>;
using pru=priority_queue<ull>;
using prdu=priority_queue<db>;
using Pri=priority_queue<int,vi,greater<int>>;
using Prl=priority_queue<ll,vl,greater<ll>>;
using Pru=priority_queue<ull,vu,greater<ull>>;
using Prdu=priority_queue<db,vdb,greater<db>>;
#define pq priority_queue
#define pb push_back
#define epb emplace_back
#define fr first
#define sc second
#define P(i,a,b) for(int i=a;i<=b;i++)
#define Q(i,a,b) for(int i=a;i>=b;i--)
#define all(x) x.begin(),x.end()
#define ppc __builtin_popcount
#define ctz __builtin_ctz
#define rd read()
char buffer[100000];
char *pa(buffer),*pb_(buffer);
#define getchar pa==pb_&&(pb_=(pa=buffer)+fread(buffer,1,100000,stdin),pa==pb_)?EOF:*pa++
#define To_s(x) #x
#define splic(x,y) x##y
ll read(){
ll t=1,x=0;
char c=getchar;
while(c<'0'||c>'9'){
if(c=='-')t=-1;
c=getchar;
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^48);
c=getchar;
}
return x*t;
}
const int N=100005;
int vis[N],dis[N],to[N],head[N],nxt[N],cnt;
int dis2[N],vis2[N];
void add(int u,int v){
to[++cnt]=v;
nxt[cnt]=head[u];
head[u]=cnt;
}
namespace QwQ{
/*write your function*/
int cnt;
bool circle;
void dfs(int u){
if(cnt>=1e5){
circle=true;
return;
}
cnt++;
vis[u]=1;
for(int i=head[u];i;i=nxt[i]){
if(!vis[to[i]]){
dis[to[i]]=dis[u]+1;
dfs(to[i]);
}
}
}
}
#define TestCases
void clear(){
/*write something here...*/
for(int i=0;i<N;i++){
vis[i]=0,vis2[i]=0,dis[i]=-1,dis2[i]=INT_MAX;
to[i]=0,head[i]=0,nxt[i]=0;
}
cnt=0;
QwQ::circle=0,QwQ::cnt=0;
}
void solve(int T){
if(!T)return;
clear();
int n=rd,m=rd;
P(i,1,m){
int u=rd,v=rd;
add(u,v),add(v,u);
}
dis[1]=0;
QwQ::dfs(1);
if(QwQ::circle){
puts("0.000");
solve(T-1);
}
solve(T-1);
pq<pii,vector<pii>,greater<pii>>q;
q.push({0,1});
dis2[1]=0;
while(q.size()){
int u=q.top().sc;
q.pop();
vis2[u]=1;
for(int i=head[u];i;i=nxt[i]){
if(dis2[to[i]]>dis2[u]+1){
dis2[to[i]]=dis2[u]+1;
q.push({dis2[to[i]],to[i]});
}
}
}
for(int i=1;i<=n;i++){
dis2[i]=(dis2[i]!=INT_MAX?dis2[i]:-1);
}
bool flag=false;
for(int i=1;i<=n;i++){
if(dis[i]!=dis2[i]){
flag=true;
break;
}
}
if(flag)puts("0.000");
else puts("1.000");
}
int main(){
#ifdef TestCases
int T=rd;
solve(T);
#endif
__THE_END__by_NR__;
}
哪里有问题