最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

codeforcesRound#259(div2)E解题报告

来源:懂视网 责编:小采 时间:2020-11-09 08:02:32
文档

codeforcesRound#259(div2)E解题报告

codeforcesRound#259(div2)E解题报告:E. Little Pony and Summer Sun Celebration time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Twilight Sparkle learnt that the evil Nightmare Moon would return during the upcoming Su
推荐度:
导读codeforcesRound#259(div2)E解题报告:E. Little Pony and Summer Sun Celebration time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Twilight Sparkle learnt that the evil Nightmare Moon would return during the upcoming Su

解法:

首先我们可以明确一点,这就是一个图的遍历,找一个点,设为起点,建立一个搜索遍历树,对于树每一个点,我们完全可以控制奇偶性,假设:

目前访问的点为v,父节点为fa,如若点v不符合当前的奇偶性,则就让父节点到v绕一次,这样 odd[v] ^= 1, fa[v] ^= 1,这样我们可以完全保证完全控制子节点,将不符合要求的奇偶性调整成符合要求的奇偶性。同时父节点的奇偶性也在改变。

通过上述的操作,我们可以每次保证子节点的奇偶性符合要求,然而父节点的奇偶性如若不符合要求,则可以通过调整父节点 与 父节点的父节点来调整奇偶性,这样我们就可以奇偶性传递,最终传递到根节点。根节点如若不符合该如何调整呢?由于我们是走遍历树,到达叶节点还要回来的,意味着我们要走至少两次根节点,一次是出发,一次是最后一次回归。我们可以将根节点 r1 调整到根节点的其中一个子节点r2,使得奇偶性再次得到调整

代码:

#include 
#include 
#define N_max 123456

using namespace std;

int n, m, fa[N_max], want[N_max];
int Odd_n, Odd_x, haveOdd[N_max];
vector  G[N_max], ans;

int getf(int x) {
	return (fa[x] == x) ? x : fa[x] = getf(fa[x]);
}
void addedge(int x, int y) {
	G[x].push_back(y);
}

void init() {
	scanf("%d%d", &n, &m);

	for (int i = 1; i <= n; i++) fa[i] = i;
	for (int i = 1; i <= m; i++) {
	int x, y;

	scanf("%d%d", &x, &y);

	int tmpx=getf(x);
	int tmpy=getf(y);
	if (tmpx != tmpy) {
	fa[tmpx] = tmpy;
	addedge(x, y);
	addedge(y, x);
	}
	}

	for (int i = 1; i <= n; i++) {
	scanf("%d", &want[i]);

	if (want[i]) haveOdd[getf(i)] = 1;
	}

	for (int i = 1; i <= n; i++)
	if (haveOdd[i]) {
	Odd_n++;
	Odd_x = i;
	}
}

void dfs(int now, int pre) {
	ans.push_back(now);
	want[now] ^= 1;

	for (int i = 0; i < G[now].size(); i++) {
	int nex = G[now][i];
	if (nex == pre) continue;

	dfs(nex, now);
	ans.push_back(now);
	want[now] ^= 1;

	if (want[nex]) {
	ans.push_back(nex);
	want[nex] ^= 1;
	ans.push_back(now);
	want[now] ^= 1;
	}
	}
}

void solve() {
	if (Odd_n == 0) {
	printf("0\n");
	return;
	}

	if (Odd_n > 1) {
	printf("-1\n");
	return;
	}

	dfs(Odd_x, -1);
	int x = 0;
	if (want[Odd_x]) x=1;

	printf("%d\n", ans.size() - x);
	for (int i = x; i < ans.size(); i++)
	printf("%d ", ans[i]);
}

int main() {
	init();
	solve();
}

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

codeforcesRound#259(div2)E解题报告

codeforcesRound#259(div2)E解题报告:E. Little Pony and Summer Sun Celebration time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Twilight Sparkle learnt that the evil Nightmare Moon would return during the upcoming Su
推荐度:
标签: 报告 解题 round
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top