40分是为啥啊

P2899 [USACO08JAN] Cell Phone Network G

```cpp #include<bits/stdc++.h> #define int long long #define mem(x,y) memset(x,y,sizeof(x)) #define frein freopen("in.in","r",stdin) #define freout freopen("out.out","w",stdout) using namespace std; int read(){ int s = 0,w = 1; char ch = getchar(); while(ch < '0' || ch > '9'){if(ch == '-')w = -1;ch = getchar();} while(ch >= '0' && ch <= '9')s = s * 10 + ch - '0',ch = getchar(); return s * w; } struct node{ int to; int nxt; }e[3000010]; int cnt,head[3000010]; int n; int dp[3000010][4];//自己染自己是2,父亲染自己是3,儿子染自己是1 void add(int x,int y){ cnt ++; e[cnt].to = y; e[cnt].nxt = head[x]; head[x] = cnt; } void dfs(int x,int fa){ vector <int> q; for(int i = head[x];i;i = e[i].nxt){ int v = e[i].to; if(v != fa){ dfs(v,x); dp[x][2] += min(dp[v][3],min(dp[v][1],dp[v][2])); dp[x][3] += min(dp[v][1],dp[v][2]); dp[x][1] += dp[v][2]; q.push_back(dp[v][1] - dp[v][2]); } } if(!q.size())dp[x][1] = 2147483647777; else { sort(q.begin(),q.end()); for(int i = 0;i <= q.size() - 2;i ++){ if(q[i] < 0)dp[x][1] += q[i]; else break; } } } signed main(){ cin>>n; for(int i = 1;i <= n - 1;i ++){ int x,y; x = read(),y = read(); add(x,y); add(y,x); } for(int i = 1;i <= n;i ++)dp[i][2] = 1; dfs(1,-1); cout<<min(dp[1][1],dp[1][2]); } ```
by EDqwq @ 2021-07-10 00:16:52


@[EDqwq](/user/294562) 100 ```cpp #include<bits/stdc++.h> #define int long long #define mem(x,y) memset(x,y,sizeof(x)) #define frein freopen("in.in","r",stdin) #define freout freopen("out.out","w",stdout) using namespace std; int read(){ int s = 0,w = 1; char ch = getchar(); while(ch < '0' || ch > '9'){if(ch == '-')w = -1;ch = getchar();} while(ch >= '0' && ch <= '9')s = s * 10 + ch - '0',ch = getchar(); return s * w; } struct node{ int to; int nxt; }e[3000010]; int cnt,head[3000010]; int n; int dp[3000010][4]; void add(int x,int y){ cnt ++; e[cnt].to = y; e[cnt].nxt = head[x]; head[x] = cnt; } void dfs(int x,int fa){ vector <int> q; for(int i = head[x];i;i = e[i].nxt){ int v = e[i].to; if(v != fa){ dfs(v,x); dp[x][2] += min(dp[v][3],min(dp[v][1],dp[v][2])); dp[x][3] += min(dp[v][1],dp[v][2]); dp[x][1] += dp[v][2]; q.push_back(dp[v][1] - dp[v][2]); } } if(!q.size())dp[x][1] = 2147483647777; else { sort(q.begin(),q.end()); int end=q.size()-2; //新增 for(int i = 0;i <= end;i ++){ if(q[i] < 0)dp[x][1] += q[i]; else break; } } } signed main(){ cin>>n; for(int i = 1;i <= n - 1;i ++){ int x,y; x = read(),y = read(); add(x,y); add(y,x); } for(int i = 1;i <= n;i ++)dp[i][2] = 1; dfs(1,-1); cout<<min(dp[1][1],dp[1][2]); } ```
by 天南星魔芋 @ 2021-07-10 07:38:10


@[天南星魔芋](/user/399239) 能告知一下为什么吗 看上去并没有差异
by EDqwq @ 2021-07-10 12:44:41


@[EDqwq](/user/294562) 用 `//` 标注释了啊 `sort` 附近
by 天南星魔芋 @ 2021-07-10 12:58:13


|