hdu 5424 Rikka with Graph II(欧拉通路)

582 篇文章 0 订阅
8 篇文章 0 订阅

题目链接:hdu 5424 Rikka with Graph II


删掉至多一条,判断剩下的边是否可以形成欧拉通路,并且要保证联通。


#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;
const int maxn = 1005;
typedef pair<int,int> pii;

int N, C[maxn], F[maxn], si[5];
vector<pii> S;

int find (int x) { return x == F[x] ? x : F[x] = find(F[x]); } 

bool link (int u, int v) {
	if (find(u) != find(v)) {
		F[find(u)] = find(v);
		return true;
	}
	return false;
}

void init () {
	S.clear();
	memset(C, 0, sizeof(C));

	int u, v;
	for (int i = 1; i <= N; i++) {
		scanf("%d%d", &u, &v);
		if (u == v) continue;
		S.push_back(make_pair(u, v));
	}

	for (int i = 0; i < S.size(); i++) {
		C[S[i].first]++;
		C[S[i].second]++;
	}
}

bool del (int u, int v, int& c1, int& c3) {
	c1 = c3 = 0;
	if (C[u] == 1 || C[v] == 1) return false;

	if (C[u] == 2) c1++;
	else c3++;
	if (C[v] == 2) c1++;
	else c3++;
	return true;
}

bool justify (int idx) {
	int n = N;
	for (int i = 1; i <= N; i++) F[i] = i;

	for (int i = 0; i < S.size(); i++) {
		if (idx == i) continue;
		if (link(S[i].first, S[i].second)) n--;
	}
	return n == 1;
}

bool judge () {
	if (N == 1) return true;

	memset(si, 0, sizeof(si));
	for (int i = 1; i <= N; i++) {
		if (C[i] > 3) return false;
		si[C[i]]++;
	}

	if (si[0] || si[3] > 2 || si[1] > 2) return false;

	if (si[3] == 0 && si[1] == 2 && justify(-1)) return true;

	int c1, c3;
	for (int i = 0; i < S.size(); i++) {
		if (del(S[i].first, S[i].second, c1, c3)) {
			if (si[3] == c3 && c1 + si[1] == 2 && justify(i)) return true;
		}
	}
	return false;
}

int main () {
	while (scanf("%d", &N) == 1) {
		init();
		printf("%s\n", judge() ? "YES" : "NO");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值