题目
传送门:QWQ
分析
凉凉。
答案是所有要经过的点到根所经过的边权和减去最大的边权。
代码
vector好慢啊
#include <cstdio> #include <vector> #include <algorithm> using namespace std; const int maxn=105000; int d[maxn], fa[maxn]; struct Edge{int u,v,dis;}; vector<int> G[maxn];vector<Edge> edges; int n, ans; int val[maxn], vis[maxn]; void Addedge(int u,int v,int dis){ edges.push_back((Edge){u,v,dis});edges.push_back((Edge){v,u,dis}); int m=edges.size()-1;G[u].push_back(m-1);G[v].push_back(m); } int dfs(int x,int f,int depth){ fa[x]=f; d[x]=depth; for(int i=0;i<G[x].size();i++){ Edge v=edges[G[x][i]]; if(v.v==f) continue; dfs(v.v,x,depth+v.dis); if(vis[v.v]) vis[x]=1,ans+=edges[G[x][i]].dis*2; } } int main(){ int n,k,a,b,c; scanf("%d%d",&n,&k); for(int i=0;i<n-1;i++){ scanf("%d%d%d",&a,&b,&c); Addedge(a,b,c); } int m; scanf("%d",&m); for(int i=0;i<m;i++){ scanf("%d",&val[i]); vis[val[i]]=1; } dfs(k,0,0); int maxnum=0; for(int i=1;i<=n;i++){ if(vis[i]) maxnum=max(maxnum,d[i]); } printf("%d",ans- maxnum); return 0; } /* 4 2 1 2 1 4 2 2 2 3 3 1 1 */
本文介绍了一种基于图论的算法实现思路,通过计算特定节点到根节点路径上的边权总和,并减去最大边权来得出最终答案。文章提供了一个具体的代码实现案例,包括输入输出处理、图的构建及深度优先搜索等关键步骤。
&spm=1001.2101.3001.5002&articleId=95501915&d=1&t=3&u=a9d30b810f6147a2a0dfef646fc6a1fd)
688

被折叠的 条评论
为什么被折叠?



