Gym 101482.H

来源:互联网 发布:单片机串口引脚 编辑:程序博客网 时间:2024/06/05 14:36

题意:给你一棵树,每个树有两个频道,相邻结点至少有一个频道相同,使得相邻结点的相同的频道的集合尽量的大。输出方案。第一个样例的集合大小为2,第二个样例大小的集合大小为6。

思路:直接dfs,标记所有用过的颜色,然后对每个孩子结点考虑一下,颜色v1是否用过,没用过用v1,打标记。否则用颜色v2,打标记。

#include <bits/stdc++.h>using namespace std;const int maxn = 10000 + 5;pair<int, int>ans[maxn];vector<int>G[maxn];int cnt, vis[maxn];void dfs(int cur, int fa, int v1, int v2){    int siz = G[cur].size();    ans[cur] = {v1, v2};    for(int i = 0; i < siz; i++)    {        int to = G[cur][i];        if(to == fa)    continue;        if(G[to].size() == 1)   vis[v1] = vis[v2] = 1, dfs(to, cur, v1, v2);        else if(vis[v1] == 0)  vis[v1] = 1, dfs(to, cur, v1, cnt++);        else vis[v2] = 1, dfs(to, cur, v2, cnt++);    }}int main(){    int n;    scanf("%d", &n);    for(int i = 0; i < n - 1; i++)    {        int x, y;        scanf("%d%d", &x, &y);        G[x].push_back(y);        G[y].push_back(x);    }    cnt = 3;    dfs(1, -1, 1, 2);    ans[1] = {1, 2};    for(int i = 1; i <= n; i++) printf("%d %d\n", ans[i].first, ans[i].second);    return 0;}
原创粉丝点击