毛毛蟲一個比較簡單的樹形dp
但是因爲我沒有判斷是不是根節點只得了50分
50分代碼
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAXN 300010
using namespace std;
int n, m, x, y;
int ans, cnt;
int now[MAXN], vis[MAXN];
int ans1[MAXN], maxx[MAXN], maxx1[MAXN], size[MAXN]; // maxx最大值,maxx1次大值
struct E {
int from, to, nxt;
}es[MAXN * 2];
int read() {
int f = 1, k = 0;
char c = getchar();
while(c > '9' || c < '0') {
if(c == '-') {
f = -1;
}
c = getchar();
}
while(c >= '0' && c <= '9') {
k = k * 10 + c - '0';
c = getchar();
}
return f * k;
}
void addedge(int a, int b) {
es[++cnt].from = a;
es[cnt].to = b;
es[cnt].nxt = now[a];
now[a] = cnt;
}
void dfs(int a) {
vis[a] = 1;
int sum = 0;
for(int i = now[a]; i != 0; i = es[i].nxt) {
if(!vis[es[i].to]) {
sum ++;
dfs(es[i].to);
if(size[es[i].to] >= maxx[a]) {
maxx1[a] = maxx[a];
maxx[a] = size[es[i].to];
} else if(size[es[i].to] >= maxx1[a] && size[es[i].to] < maxx[a]){
maxx1[a] = size[es[i].to];
}
}
}
if(!sum) {
size[a] = 1;
ans1[a] = 0;
maxx[a] = 0;
return ;
} else {
size[a] = maxx[a] + sum;
ans1[a] = size[a] + maxx1[a] - 1;
}
}
int main() {
n = read(), m = read();
for(int i = 1; i <= m; i++) {
x = read(), y = read();
addedge(x, y);
addedge(y, x);
}
dfs(1);
for(int i = 1; i <= n; i ++) {
ans = max(ans, ans1[i]);
}
printf("%d", ans);
return 0;
}
ac代碼
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAXN 300010
using namespace std;
int n, m, x, y;
int ans, cnt;
int now[MAXN], vis[MAXN], son[MAXN];
int ans1[MAXN], maxx[MAXN], maxx1[MAXN], size[MAXN]; // maxx最大值,maxx1次大值
struct E {
int from, to, nxt;
}es[MAXN * 2];
int read() {
int f = 1, k = 0;
char c = getchar();
while(c > '9' || c < '0') {
if(c == '-') {
f = -1;
}
c = getchar();
}
while(c >= '0' && c <= '9') {
k = k * 10 + c - '0';
c = getchar();
}
return f * k;
}
void addedge(int a, int b) {
es[++cnt].from = a;
es[cnt].to = b;
es[cnt].nxt = now[a];
now[a] = cnt;
}
void dfs(int a) {
vis[a] = 1;
int sum = 0;
for(int i = now[a]; i != 0; i = es[i].nxt) {
if(!vis[es[i].to]) {
sum ++;
dfs(es[i].to);
if(size[es[i].to] >= maxx[a]) {
maxx1[a] = maxx[a];
maxx[a] = size[es[i].to];
} else if(size[es[i].to] >= maxx1[a] && size[es[i].to] < maxx[a]){
maxx1[a] = size[es[i].to];
}
}
}
if(!sum) {
size[a] = 1;
ans1[a] = 0;
maxx[a] = 0;
return ;
} else {
size[a] = maxx[a] + son[a] - 1;;
ans1[a] = maxx[a] + maxx1[a] + son[a] - 1;
}
}
int main() {
n = read(), m = read();
for(int i = 1; i <= m; i++) {
x = read(), y = read();
addedge(x, y);
addedge(y, x);
son[x] ++;
son[y] ++;
}
dfs(1);
for(int i = 1; i <= n; i ++) {
ans = max(ans, ans1[i]);
}
printf("%d", ans);
return 0;
}