Submission #19887

#TimeUsernameProblemLanguageResultExecution timeMemory
19887gs13068트리 (kriii4_X)C++98
100 / 100
640 ms16260 KiB
#include <cstdio>
#include <map>

const int p = 1000000007;

using namespace std;

int pw(int x, int y)
{
	return y & 1 ? (long long)pw(x, y ^ 1)*x%p : y ? pw((long long)x*x%p, y >> 1) : 1;
}

map<int, int> M, S;

int f(int x)
{
	if (M.find(x) == M.end()) M[x] = x;
	int t = M[x];
	return x == t ? x : M[x] = f(t);
}

void g(int x, int y)
{
	x = f(x);
	y = f(y);
	if (S.find(x) == S.end()) S[x] = 1;
	if (S.find(y) == S.end()) S[y] = 1;
	S[x] += S[y];
	M[y] = M[x];
}

int main()
{
	map<int, int>::iterator it;
	int i, j, k, n, m, r;
	scanf("%d%d", &n, &m);
	for (k = 0; k < m;k++)
	{
		scanf("%d%d", &i, &j);
		if (f(i) == f(j))
		{
			puts("0");
			return 0;
		}
		g(i, j);
	}
	if (m == n - 1)
	{
		puts("1");
		return 0;
	}
	r = pw(n, n - m - 2);
	for (it = S.begin(); it != S.end(); it++) if (it->first == f(it->first)) r = (long long)r * it->second % p;
	printf("%d", r);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...