设A为
#include <bits/stdc++.h>
using namespace std;
int n,m;
int uu[410];
int vv[410];
int edges[1<<20];
inline int lowbit(int x){
return x&(-x);
}
int adj[22];
bool bfs(int mask){
int conn = lowbit(mask);
int T = n;
while(T--){
for(int i=0;i<n;i++){
if(((1<<i)&mask) && ((1<<i)&conn)){
conn |= adj[i];
}
}
if((conn&mask) == mask){
return 1;
}
}
return 0;
}
int main(){
int t;
cin>>t;
int cas = 0;
while(t--){
cas++;
memset(edges,0,sizeof(edges));
memset(adj,0,sizeof(adj));
cin>>n>>m;
for(int i=0;i<m;i++){
int u,v;
scanf("%d%d",&u,&v);
uu[i] = u;
vv[i] = v;
adj[u] |= (1<<v);
adj[v] |= (1<<u);
}
int End = 1<<n;
int tot = 0;
for(int k=1;k<End-1;k++){
if(k>(k^(End-1))){
continue;
}
if(bfs(k) && bfs(k^(End-1))){
edges[k] = 1;
edges[k^(End-1)] = 1;
tot++;
}
}
for(int i=0;i<n;i++){
for(int j=1;j<End;j++){
if((1<<i)&j){
edges[(1<<i)^j] += edges[j];
}
}
}
printf("Case #%d:",cas);
for(int i=0;i<m;i++){
printf(" %d",tot - edges[(1<<uu[i])|(1<<vv[i])]);
}
printf("\n");
}
return 0;
}