package contest;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Terminal {
static final int maxN = 300005;
static final int maxM = 500005;
static final int MOD = 100000007;
static int T, N, M;
static long ans;
static int[][] parent = new int[2][maxN];// 0 parent, 1 size
static int[] indeg = new int[maxN];
static Edge[] edges = new Edge[maxM];
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("D:\\Work\\Project\\contest\\src\\data\\Terminal.in"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
for (int i = 0; i < maxN; i++) {
parent[0][i] = i;
parent[1][i] = 1;
}
for (int tc = 1; tc <= T; tc++) {
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
ans = 1;
if (M == 0) {
System.out.println("#" + tc + " " + ans);
continue;
}
for (int i = 1; i <= M; i++) {
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
edges[i] = new Edge(Math.max(u, v), Math.min(u, v));
indeg[u]++;
indeg[v]++;
}
for (int i = 1; i <= M; i++) {
union(edges[i].u, edges[i].v);
}
for (int i = 1; i <= N; i++) {
if (parent[0][i] != i)
continue;
if (parent[1][i] == 0)
continue;
if (parent[1][i] <= 2) {
ans = (ans * parent[1][i]) % MOD;
continue;
}
ans = (ans * parent[1][i]) % MOD;
}
System.out.println("#" + tc + " " + ans % MOD);
for (int i = 0; i <= N; i++) {
parent[0][i] = i;
parent[1][i] = 1;
edges[i] = null;
}
Arrays.fill(indeg, 0);
}
}
static int find(int x) {
if (parent[0][x] == x) {
return x;
}
parent[0][x] = find(parent[0][x]);
return parent[0][x];
}
static void union(int a, int b) {
int fa = find(a);
int fb = find(b);
if (fa != fb) {
if (indeg[fa] < indeg[fb]) {
parent[0][fa] = fb;
if (indeg[a] == 1) {
parent[1][fb] += indeg[fa];
}
} else {
parent[0][fb] = fa;
if (indeg[b] == 1) {
parent[1][fa] += indeg[fb];
}
}
}
}
static class Edge {
int u, v;
Edge(int u, int v) {
this.u = u;
this.v = v;
}
}
}
20210419 端点
最新推荐文章于 2021-08-22 22:05:50 发布