首页 > 其他分享 >P3022 [USACO11OPEN] Odd degrees G

P3022 [USACO11OPEN] Odd degrees G

时间:2024-07-09 11:19:46浏览次数:21  
标签:std 度数 int Odd USACO11OPEN 偶数 long P3022 define

P3022 [USACO11OPEN] Odd degrees G

构造

每个连通块独立,考虑其中一个如何构造。因为无向图的度数一定是偶数,而每个点的度数是奇数,所以点数为奇数,否则无解。

考虑建 dfs 树,不关心非树边,只考虑树边的取舍构造。自底向上构造,假如当前 \(u\) 的儿子 \(v\) 为偶数,那么就不能取 \((u,v)\) 边。这样合并到根,由于度数和为偶数,点数为偶数,并且根的子孙度数已经都为奇数,那么剩下的度数一定是奇数,所以一定合法。

复杂度 \(O(n)\)。

#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define mk std::make_pair
#define fi first
#define se second
#define pb push_back

using i64 = long long;
using ull = unsigned long long;
const i64 iinf = 0x3f3f3f3f, linf = 0x3f3f3f3f3f3f3f3f;
const int N = 5e4 + 10, M = 1e5 + 10;
int n, m, ans;
int vis[N], a[N], ok[M];
std::vector<pii> e[N];
std::vector<int> ret;
void dfs(int u) {
	vis[u] = 1;
	for(auto x : e[u]) {
		int v = x.fi, id = x.se;
		if(vis[v]) continue;
		
		dfs(v);
		if(!(a[v] & 1)) {
			ok[id] = 0; ans--;
			a[v]--, a[u]--;
		}
	}
}
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
	std::cin >> n >> m;
	ans = m;
	for(int i = 1; i <= m; i++) {
		int u, v;
		std::cin >> u >> v;
		e[u].pb({v, i});
		e[v].pb({u, i});
		a[u]++, a[v]++;
		ok[i] = 1;
	}

	for(int i = 1; i <= n; i++) {
		if(!vis[i]) {
			dfs(i);
			if(!(a[i] & 1)) {
				std::cout << "-1\n";
				return 0;
			}
		}
	}

	std::cout << ans << "\n";
	for(int i = 1; i <= m; i++) {
		if(ok[i]) std::cout << i << "\n";
	}

	return 0;
}

标签:std,度数,int,Odd,USACO11OPEN,偶数,long,P3022,define
From: https://www.cnblogs.com/FireRaku/p/18291396

相关文章

  • Lesson 3 An unknown goddess 无名女神
    Howdidthearchaeologistsknowthatthestatuewasagoddess?1.原文Sometimeago,aninterestingdiscoverywasmadebyarchaeologistsontheAegeanislandofKea.AnAmericanteamexploredatemplewhichstandsinanancientcityonthepromontoryo......
  • LeetCode 2595. Number of Even and Odd Bits
    原题链接在这里:https://leetcode.com/problems/number-of-even-and-odd-bits/description/题目:Youaregivena positive integer n.Let even denotethenumberofevenindicesinthebinaryrepresentationof n (0-indexed)withvalue 1.Let odd denotethen......
  • 攻防世界-难度1- toddler_regs
    攻防世界-难度1toddler_regs.zip运行ida静态分析shift+f12搜索字符串点过去F5先搞定g_team_idx,一路跟过去F5g_team_idx=23;还需要两个数组内容:team[]和teamjnu[],点过去就行了。只需要提取其中的内容就行了。注意字符串末尾是'\0',编写脚本时要注意这点team=......
  • 攻防世界-难度1- toddler_regs
    攻防世界-难度1toddler_regs.zip运行idashift+f12搜索字符串点过去F5先搞定g_team_idx,一路跟过去F5g_team_idx=23;还需要两个数组内容:team[]和teamjnu[],点过去就行了。只需要提取其中的内容就行了。注意字符串末尾是'\0',编写脚本时要注意这点team="""......
  • 原语笔记:IDDR和ODDR
    IDDR IDDR的工作模式OPPOSITE_EDGE SAME_EDGEModeSAME_EDGE_PIPELINEDMode    参考使用:generategenvari;for(i=0;i<4;i=i+1)begin:iddr_blockIDDR#(.DDR_CLK_EDGE("SAME_EDGE_PIPELINED"),//"OPP......
  • F - Oddly Similar
    F-OddlySimilarProblemStatementThereare$N$sequencesoflength$M$,denotedas$A_1,A_2,\ldots,A_N$.The$i$-thsequenceisrepresentedby$M$integers$A_{i,1},A_{i,2},\ldots,A_{i,M}$.Twosequences$X$and$Y$oflength$M$aresaidtobe......
  • P9077 [PA2018] Poddrzewo 题解
    思考感觉题目有点迷惑的意思,要最小化操作\(1\)使用的次数,也就是要节约修改操作,让我们认为操作\(1\)是最有用的,其实只要稍微动动脑子想一想,删除操作才是最有用的,而交换操作根本没用。当将序列删除到只剩两个点时,就把两个点连上,度都为\(1\)。所以如果序列中\(1\)的数量超......
  • 【题解】P2627 [USACO11OPEN] Mowing the Lawn G
    【题解】P2627[USACO11OPEN]MowingtheLawnG题目跳转数据量比较大,暴力肯定是不行的。只能考虑用动态规划的方式来做。这道题有许多dp设计的思路,这里提供两个:方法一:普通状态设计定义\(dp[i][1/0]\)表示截止遍历到第\(i\)个元素时,选择第\(i\)个元素或不选第\(i\)个元素可以......
  • 洛谷题单指南-搜索-P1825 [USACO11OPEN] Corn Maze S
    原题链接:https://www.luogu.com.cn/problem/P1825题意解读:计算最短路,依然是BFS。解题思路:相比传统的最短路迷宫,多了个传输装置,要解决几个关键问题:1、传输装置的存储定义一个数组,vector<node>trans[30],数据的每个元素都是一个vector<node>,里面存两个节点,即一对坐标2、传输......
  • ABC134F Permutation Oddness
    [ABC134F]PermutationOddness好题,牛牛的一个套路——\(\textsfH\)\(\textsf{anghang}\)写起来简单,想起来难的一个东西,难点主要是在状态设置上我们可以把\(1\simN\)拆点,于是原题相当于求一个二分图的完美匹配,并使其怪异度为\(k\)我们考虑设置\(f_{i,j,k}\)......