其他分享
首页 > 其他分享> > Codeforces 103 B —— Cthulhu

Codeforces 103 B —— Cthulhu

作者:互联网

前言

image
哇塞,太萌了吧!

正文

题面

有一个 $ n $ 个顶点 $ m $ 条边的无向图,问这个图是不是一个环,其中这个环的每一个节点都可以看做一颗树的根。

思路

转换!转换!!转换!!!
首先,假如我们的图是联通的话:

而这题其实就是说,图是否联通并且是否恰好有一个环。
那么,那么就好写了。

代码

Lorem ipsum dolor sit amet...
开个玩笑啦。

#include <bits/stdc++.h>
using namespace std;

int read() {
	int f = 0, w = 1; char ch = getchar();
	while ('0' > ch || ch > '9') if (ch == '-') w = -1, ch = getchar();
	while ('0' <= ch && ch <= '9') f = f * 10 + (ch - '0'), ch = getchar();
	return f * w;
}

void write(int x) {
	static char stk[35], cnt = 0;
	do {
		stk[cnt++] = x % 10 + '0', x /= 10;
	} while (x);
	for (int i = cnt - 1; i >= 0; i--) putchar(stk[i]);
	putchar(' ');
}

vector<int> gg[105];

int n, m, cnt = 0;
bool v[105];

void dfs(int x) {
	if (v[x]) return;
	v[x] = 1, cnt++;
	for (auto adj : gg[x]) dfs(adj);
}

int main() {
	int n = read(), m = read();
	for (int i = 0; i < m; i++) {
		int x = read() - 1, y = read() - 1;
		gg[x].push_back(y), gg[y].push_back(x);
	}
	if (n != m) puts("NO");
	else {
		dfs(0);
		if (n != cnt) puts("NO");
		else puts("FHTAGN!");
	}
	return 0;
}

后续

附上蒟蒻的初版代码:

#include <bits/stdc++.h>
using namespace std;

int read() {
	int f = 0, w = 1; char ch = getchar();
	while ('0' > ch || ch > '9') if (ch == '-') w = -1, ch = getchar();
	while ('0' <= ch && ch <= '9') f = f * 10 + (ch - '0'), ch = getchar();
	return f * w;
}

void write(int x) {
	static char stk[35], cnt = 0;
	do {
		stk[cnt++] = x % 10 + '0', x /= 10;
	} while (x);
	for (int i = cnt - 1; i >= 0; i--) putchar(stk[i]);
	putchar(' ');
}

vector<int> graph[105];
int vis[105];

int n, m, cycle_cnt = 0;

void dfs(int x, int fa) {
	if (vis[x] == -1) {
		cycle_cnt++;
		return;
	} else if (vis[x] == 1) {
		return;
	} else {
		vis[x] = -1;
		for (int adj : graph[x]) {
			if (adj != fa) {
				dfs(adj, x);
			}
		}
		vis[x] = 1;
	}
}

int main() {
	n = read(), m = read();
	for (int i = 0; i < m; i++) {
		int x = read(), y = read();
		x--, y--;
		graph[x].push_back(y);
		graph[y].push_back(x);
	}
	dfs(0, -1);
	if (cycle_cnt == 1) {
		bool flag = true;
		for (int i = 0; i < n; i++) {
			flag &= vis[i];
		}
		if (flag) {
			puts("FHTAGN!");
		} else {
			puts("NO");
		}
	} else {
		puts("NO");
	}
	return 0;
}

小蒟蒻太蒟蒻了,同学们都快 AK 普及组了,我第三题有时还没法满分……

标签:cnt,ch,puts,vis,int,Codeforces,Cthulhu,read,103
来源: https://www.cnblogs.com/AProblemSolver/p/16589392.html