題意: 給出一棵樹, 現在去掉一個點, 問剩下的分離的每個連通塊的大小是不是小于總大小的一半, 把這樣的節點輸出.
思路:
人家說是樹dp, 但感覺是dfs啊...Orz
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>v[10005];
int n;
bool vis[10005]= {0};
int ans[10005]= {0};
int ansi=0;
int dfs(int x)
{
vis[x]=1;
int sum=0;
int num=0;
int flag=0;
for(int i=0; i<v[x].size(); i++)
{
if(vis[v[x][i]]==0)
{
num=dfs(v[x][i]);
sum+=num;
if(num>n/2)
flag=1;
}
}
if(n-sum-1>n/2)
flag=1;
if(flag==0)
ans[ansi++]=x;
return sum+1;
}
int main()
{
scanf("%d",&n);
for(int i=0; i<n-1; i++)
{
int a,b;
scanf("%d%d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
dfs(1);
if(ansi==0)
{
printf("NONE\n");
}
else
{
sort(ans,ans+ansi);
for(int i=0; i<ansi; i++)
{
printf("%d\n",ans[i]);
}
}
}
照例貼新代碼, 感覺寫的更毒瘤了...
//#include<bits/stdc++.h>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
void debug_out() {
cerr << '\n';
}
template<typename T, typename ...R>
void debug_out(const T &f, const R &...r) {
cerr << f << " ";
debug_out(r...);
}
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]: ", debug_out(__VA_ARGS__);
typedef long long ll;
const int M = 10005;
const int inf = 1e9 + 5;
const int mod = 1e9 + 7;
int n;
struct node {
int v, nxt;
} edge[M*2];
int head[M];
int ei;
int ssum[M];
void addedge(int u, int v) {
edge[ei].v = v;
edge[ei].nxt = head[u];
head[u] = ei++;
}
int fa[M];
int dfs(int x, int f) {
int sum = 0;
for (int i = head[x]; i != -1; i = edge[i].nxt) {
int v = edge[i].v;
if (fa[v] != x && fa[v] != 0)continue;
fa[v] = x;
sum += dfs(v, f);
}
return ssum[x] = sum + 1;
}
int hlf;
void init() {
memset(head, -1, sizeof(head));
ei = 0;
scanf("%d", &n);
hlf = n / 2;
for (int i = 0; i < n - 1; i++) {
int u, v;
scanf("%d%d", &u, &v);
addedge(u, v);
addedge(v, u);
}
}
void solve() {
fa[1] = 1;
dfs(1, 1);
int hv = 0;
//
// for (int i = 1; i <= n; i++) {
// debug(i, ssum[i]);
// }
for (int i = 1; i <= n; i++) {
int flag = 0;
for (int j = head[i]; j != -1; j = edge[j].nxt) {
int v = edge[j].v;
if (fa[v] != i)continue;
if (ssum[v] <= hlf);
else {
// debug(i,v,ssum[v]);
flag = -1;
break;
}
}
// debug(i,n-ssum[i],flag);
if (n - ssum[i] <= hlf && flag == 0) {
hv = 1;
printf("%d\n", i);
}
}
if (hv == 0) {
printf("NONE\n");
}
}
int main() {
init();
solve();
return 0;
}