HDU 4714

news/2024/10/23 9:31:07/

HDU 4714

题意:

给出一棵树,设定切断一条边花费跟连接一条边的花费均为1,问将这棵树变为一个圆的最小花费。

钻牛角尖了,钻牛角尖了,一直去抓树的直径,这个时候就体现出队友的重要性了,给了我正确思路,事实上就是将这棵树切成若干棵单支树,要求单支树数量最小,然后再拼起来,就是答案了。

转移状态dp[ i ][ j ],已第I个节点为根的子树的根的可用度数为J的最小单支树数量。每个儿子都可以选择连接父亲与否,推一遍就搞掂了。

因为HDU的编译器原因,用G++,加栈依然会RE,用C++可以AC,所以将DFS改成BFS会更好。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <sstream>
#include <iostream>
#include <algorithm>
#include<cstdlib>
#include<queue>
#pragma comment(linker,"/STACK:1024000000,1024000000")  
using namespace std;#define N 1000005
#define L(x) x<<1
#define R(x) x<<1|1
#define M(x,y) (x + y)>>1
#define MOD 1000000007
#define MODD 1000000006
#define inf 0x7fffffff
#define llinf 0x7fffffffffffffff
#define LL __int64struct edge
{int v,next;
}e[N + N];int dp[N][3],cnt;
int visit[N],mark[N],ans;void addedge(int a,int b)
{e[cnt].v = b;e[cnt].next = visit[a];visit[a] = cnt++;e[cnt].v = a;e[cnt].next = visit[b];visit[b] = cnt++;
}void dfs(int x)
{dp[x][0] = dp[x][1] = dp[x][2] = 1;mark[x] = 1;for(int i = visit[x];i != -1;i = e[i].next){if(mark[e[i].v])continue;dfs(e[i].v);dp[x][0] = min(dp[x][0] + dp[e[i].v][0],dp[x][1] + dp[e[i].v][1] - 1);dp[x][1] = min(dp[x][1] + dp[e[i].v][0],dp[x][2] + dp[e[i].v][1] - 1);dp[x][2] = dp[x][2] + dp[e[i].v][0];}
}int main()
{int i,j,k,l;int n,t;scanf("%d",&t);while(t--){memset(visit,-1,sizeof(visit));ans = 0;scanf("%d",&n);for(i = 1,cnt = 0;i < n;i++){scanf("%d%d",&j,&k);addedge(j,k);}memset(mark,0,sizeof(mark));dfs(1);ans = min(min(dp[1][0],dp[1][1]),dp[1][2]);//    cout<<ans<<endl;printf("%d\n",ans*2 - 1);}return 0;
}


http://www.ppmy.cn/news/124710.html

相关文章

更新后改写m3u8文件 钉钉回放视频下载

文章目录 前言一、m3u8文件的修改方式二、下载步骤1.下载m3u8文件2.修改数据 后记 前言 今天下载钉钉群的网课&#xff0c;发现以往使用的m3u8下载方式没法正常下载了&#xff0c;经过观察发现是钉钉对m3u8文件进行了改写&#xff0c;导致正常的下载器直接下载出错。 下载m3u8…

HDU 4734

比赛的时候先写了个裸的数位dp T掉了&#xff0c;然后加加剪枝过了 #include <cstdio> #include <cstring> using namespace std;int len,lim; int num[20],mi[20],mii[20]; int dp[10][5000];int dfs(int pos,int sta,int doing){if(pos-1){if(sta<lim) return…

IN4007和IN4148的用途

IN4007的用途 二极管1n4001 1n4002 1n4003 1n4004 1n4005 1n4006 1n4007正向电流1A 二极管1N4007的最大反向电压是1000V 二极管1n4001 1n4002 1n4003 1n4004 1n4005 1n4006 1n4007常用作整流 IN4148的用途 in4148是硅材料小功率开关二极管 in4148的封装,贴片和插件都有,如贴片…

javaScript对账号卡号进行脱敏处理

导读&#xff1a;一般8位以上账号&#xff0c;显示首尾各4位&#xff0c;中间固定用8位*代替&#xff1b;8位及以下账号&#xff0c;显示首尾各2位&#xff0c;中间固定用8位*代替。 这里简单处理一下16位及以上的账号&#xff0c;卡号&#xff0c;其它的情况同理&#xff0c; …

实战 | HCL模拟器实现交换机DHCP配置案例

实战 | HCL模拟器实现交换机DHCP配置案例 https://mp.weixin.qq.com/s/D2h5uHOxJc5YlrFJxphlNQ 组网及说明 现有一台S5820交换机&#xff0c;连接两个不同的局域网&#xff0c;现要求两个不同的局域网通过DHCP自动获取IP地址后实现互联互通。 网络拓扑图如下&#xff1a; …

flashcp: verification mismatch at 0x0

# flashcp rootfs.bin /dev/mtd3 flashcp: verification mismatch at 0x0 # flashcp -v rootfs.bin /dev/mtd3 Erasing block: 75/75 (100%) Writing kb: 4745/4745 (100%) Verifying kb: 0/4745 (0%) flashcp: verification mismatch at 0x0 Flash_eraseall 擦除很快…

hdu 4745

直接在圈上写类似与lcs的dp就可以了 悲剧的是 &#xff08;j1&#xff09;% n 直接写成了 j1&#xff0c;死都找不到错 #pragma comment(linker, "/STACK:102400000,102400000") #include<iostream> #include<vector> #include<algorithm> #inclu…

#4714. 圈

题目描述 对一张无重边、无自环的 n n n 个点的无向图&#xff0c;定义圈为可以重复经过同一个点多次、但不能多次经过同一条边的环。例如&#xff0c; 1 → 2 → 1 1\to 2\to 1 1→2→1 不是一个合法的圈&#xff0c;而 1 → 2 → 3 → 4 → 5 → 3 → 1 1\to 2\to 3\to 4\…