题意:一棵 n 个点的树,要你把这些树上的节点用 k 种颜色染色,问你在最优的染色方案下,相同颜色点连接的最小边集的交集最大是多少
Tags: dfs, 貌似读懂题就好做了。。
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second typedef long long ll; const int N = 200005; int T, n, k, head[N], tot, ans, Size[N]; struct Edge{int to, next; } e[N<<2]; void Addedge(int u, int v) { e[tot]=(Edge){ v, head[u] }; head[u]=tot++; e[tot]=(Edge){ u, head[v] }; head[v]=tot++; } void dfs(int u, int fa) { ++Size[u]; for(int i=head[u], to; to=e[i].to, ~i; i=e[i].next) if(to!=fa) { dfs(to, u); Size[u] += Size[to]; if(Size[to]>=k && (n-Size[to])>=k) ++ans; } } int main() { scanf("%d", &T); while(T--) { mes(head, -1); tot=ans=0; mes(Size, 0); scanf("%d%d", &n, &k); int u, v; rep(i,1,n-1) { scanf("%d%d", &u, &v); Addedge(u, v); } dfs(1,0); printf("%d\n", ans); } return 0; }