Codeforces 453C Little Pony and Summer Sun Celebration(构造)

题目链接:Codeforces 453 Little Pony and Summer Sun Celebration

题目大意:n个节点,m条边,然后m行给定边,最后一行表示每个节点需要进过的次数为奇数次还是偶数次。

解题思路:构造,任意从一个奇数点开始(统一森林的处理),然后每次向下遍历没有经过的节点,并且回溯,每次回溯都要判断一下刚才走过的点满不满足条件,不满足的话就再走一次。最后对于根节点,最后一次回溯要不要走根据当前走过的次数决定。

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

using namespace std;
const int maxn = 1e5+5;

int N, M, a, b, s;
int ans, rec[maxn*4];
int c[maxn], v[maxn];
vector<int> g[maxn];

void init () {
    ans = s = 0;
    scanf("%d%d", &N, &M);
    memset(v, 0, sizeof(v));

    for (int i = 0; i < M; i++) {
        scanf("%d%d", &a, &b);
        g[a].push_back(b);
        g[b].push_back(a);
    }

    for (int i = 1; i <= N; i++) {
        scanf("%d", &c[i]);
        if (c[i])
            s = i;
    }
}

inline void set (int u) {
    c[u] ^= 1;
    rec[ans++] = u;
}

void dfs (int u) {
    set(u);
    v[u] = 1;

    for (int i = 0; i < g[u].size(); i++) {

        if (v[g[u][i]])
            continue;

        dfs(g[u][i]);
        set(u);

        if (c[g[u][i]]) {
            set(g[u][i]);
            set(u);
        }
    }
}

bool judge () {
    for (int i = 1; i <= N; i++)
        if (c[i])
            return false;
    return true;
}

int main () {
    init();
    dfs(s);
    if (c[s]) {
        c[s] = 0;
        ans--;
    }

    if (judge ()) {
        printf("%d\n", ans);
        if (ans) {
            printf("%d", rec[0]);
            for (int i = 1; i < ans; i++)
                printf(" %d", rec[i]);
            printf("\n");
        }
    } else
        printf("-1\n");
    return 0;
}

Codeforces 453C Little Pony and Summer Sun Celebration(构造),布布扣,bubuko.com

时间: 2024-12-20 21:31:00

Codeforces 453C Little Pony and Summer Sun Celebration(构造)的相关文章

Codeforces 453C Little Pony and Summer Sun Celebration dfs树上构造

题目链接:点击打开链接 题意: 给定一个无向图 任选一个起点,使得访问每个点的次数奇偶与最后一行的输入一致 思路: 选一个奇数点作为起点 dfs树一下,若子节点不满足则先走到子节点再回来 如此就能保证所有子节点合法 这样dfs结束后最多只有根节点不满足,随便找一个与根相连的点调整一下. #include <stdio.h> #include <string.h> #include <iostream> #include <math.h> #include &

Codeforces 453B Little Pony and Harmony Chest(状压)

题目链接:Codeforces 453B Little Pony and Harmony Chest 题目大意:给定一个序列a, 求一序列b,要求∑|ai?bi|最小.并且b中任意两数的最大公约束为1. 解题思路:因为b中不可能含有相同的因子,所以每个素数只能使用1次.又因为说ai最大为30,所以素数只需要考虑到57即可.因为即使对于30而言,59和1的代价是一样的. 所以有dp[i][j]表示的是到第i个数,使用过的素数j. #include <cstdio> #include <cs

Codeforces 453B Little Pony and Harmony Chest 状压dp

题目链接:点击打开链接 b的数字最多只能达到59,因为选>=60 不如选1 所以状压一下前面出现过的素数即可,在59内的素数很少 然后暴力转移.. #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <string.h> const int Inf = (int)(1e9); const int S = 1 <<

Codeforces 453A Little Pony and Expected Maximum 概率题Orz

题目链接:点击打开链接 #include <stdio.h> #include <iostream> #include <algorithm> using namespace std; #define INF 0x3f3f3f3f #define eps 1e-8 #define pi acos(-1.0) typedef long long ll; int main() { int i, j; double m,n; while(cin>>m>>

Codeforces 460 D Little Victor and Set (构造)

题目链接 构造的好题.表示是看了题解才会做的. 假如[l,r]长度不超过4,直接暴力就行了. 假如[l,r]长度大于等于5,那么如果k = 1,显然答案应该是l:如果k=2,可以找到a^(a+1)=1:如果k=3,首先只取两个就得到一个下界为1,但是可能出现为0的情况,下面再仔细讨论.如果k>=4,可以找到两组a^(a + 1) = 1,所以答案是0. 现在剩下的问题就是如何判断k=3的情况答案能否为0了.答案为0时我们只有可能取了3个数,设它们为x,y,z,并且不妨设有l <= z <

CodeForces 22C System Administrator 小水怡情 图论+构造

题目链接:点击打开链接 构造一个星形图+一个完全图就好了.. #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <iostream> #include <map> #include <set> #include <math.h> using namespace std; #define inf

CodeForces 686B Little Robber Girl&#39;s Zoo (构造冒泡排序)

题意:给定一排列,让你通过一个区间交换的方式,完成排序. 析:这个题说了,最多不能超过20000次,而 n 最大才100,那么冒泡排序复杂度为 n * n,才10000,肯定是可以的,所以我们就模拟冒泡排序. 代码如下: #include <iostream> #include <cmath> #include <cstdlib> #include <set> #include <cstdio> #include <cstring>

Codeforces 453B Little Pony and Harmony Chest:状压dp【记录转移路径】

题目链接:http://codeforces.com/problemset/problem/453/B 题意: 给你一个长度为n的数列a,让你构造一个长度为n的数列b. 在保证b中任意两数gcd都为1的情况下,使得 ∑|a[i]-b[i]|最小. 让你输出构造的数列b. (1<=n<=100, 1<=a[i]<=30) 题解: 因为1<=a[i]<=30,所以有1<=b[i]<=60,此时才有可能最优. 因为b中任意两数gcd为1,所以对于一个质因子p[i]

Codeforces 454C - Little Pony and Expected Maximum

454C - Little Pony and Expected Maximum 思路: m面的骰子掷n次,总共有m^n种情况,如果一种情况的最大值是m,那么它肯定包含m,那我们在所有情况下挖掉不包含m的情况:(m-1)^n,所以最大值是m的情况数是m^n-(m-1)^n,同理可得最大值是m-1的情况数是(m-1)^n-(m-2)^n.... 代码: #include<bits/stdc++.h> using namespace std; #define ll long long #define