在边权都为1的 树上加1条或者2条边(边权为1) ,从1出发遍历所有点,使得总路程最短
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include <bits/stdc++.h> using namespace std ; const int N=1e5+2,M=2*N; int nxt[M],w[M],go[M],hd[N],all=1; int D,d1[N],d2[N],b[N],m,n,id,d[N],ans,pre[N]; void add( int x, int y, int z){ go[++all]=y,w[all]=z,nxt[all]=hd[x],hd[x]=all; } void dfs1( int x, int last){ int i,y,z; if (d[x]>ans){ ans=d[x],id=x; } for (i=hd[x];i;i=nxt[i]){ y=go[i],z=w[i]; if (y!=last){ d[y]=d[x]+z; pre[y]=i; dfs1(y,x); } } } void dfs( int x, int last){ int i,y,z; for (i=hd[x];i;i=nxt[i]){ y=go[i],z=w[i]; if (y!=last){ dfs(y,x); if (d1[x]<d1[y]+z) d2[x]=d1[x],d1[x]=d1[y]+z; else if (d2[x]<d1[y]+z) d2[x]=d1[y]+z; } } D=max(D,d1[x]+d2[x]); } signed main(){ int i,t,x,y,z; cin>>n>>m; for (i=1;i<n;i++) cin>>x>>y,add(x,y,1),add(y,x,1); dfs1(1,0); t=id; memset(d,0, sizeof (d)),ans=0; dfs1(id,0); if (m==1){ cout<<2*(n-1)-ans+1; return 0; } x=id; for (;x!=t;x=go[i^1]){ i=pre[x]; w[i]=w[i^1]=-1; } D=0; dfs(1,0); cout<<n*2-ans-D; return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!