博弈论

来源:互联网 发布:js小数做加减 编辑:程序博客网 时间:2024/06/16 04:48



1、HDU 5963 朋友

参考:http://www.cnblogs.com/bin-gege/p/6033798.html

与 r 相连的边权值的和为奇数时 Girls win!

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;const int maxn = 4e4 + 10;int T, n, m, cmd, x, y, z, edge = 0;int head[maxn], Next[2 * maxn], to[2 * maxn], val[2 * maxn];void init(void);void add_edge(int u, int v, int _val);int main() {#ifdef Floyd    freopen("in.txt", "r", stdin);#endif // Floyd    scanf("%d", &T);    while (T--) {        init();        scanf("%d %d", &n, &m);        for (int i = 1; i < n; ++i) {            scanf("%d %d %d", &x, &y, &z);            add_edge(x, y, z); add_edge(y, x, z);        }        while (m--) {            scanf("%d", &cmd);            if (cmd == 0) {                scanf("%d", &x);                int ans = 0;                for (int i = head[x]; i != -1; i = Next[i]) {                    ans += val[i];                }                if (ans & 1) {                    printf("Girls win!\n");                } else {                    printf("Boys win!\n");                }            } else {                scanf("%d %d %d", &x, &y, &z);                for (int i = head[x]; i != -1; i = Next[i]) {                    if (to[i] == y) {                        val[i] = z;                        break;                    }                }                for (int i = head[y]; i != -1; i = Next[i]) {                    if (to[i] == x) {                        val[i] = z;                        break;                    }                }            }        }    }    return 0;}void init(void) {    memset(head, -1, sizeof(head));    edge = 0;}void add_edge(int u, int v, int _val) {    to[edge] = v; val[edge] = _val; Next[edge] = head[u]; head[u] = edge++;}



0 0
原创粉丝点击