Eternal Victory
题意:给出n个点,再给出n-1条路,想一口气从1走完n个点的最小距离。
思路:好像它不构成环!md没看清题目,所以说每次遍历完全部的点后,最短的路就是每条边的距离*2减去最长路的距离。
所以简单的dfs求最长路。
#include<cstring> #include<algorithm> #include<vector> #include<map> #include<queue> #include<cstdio> #include<cmath> #define ll long long using namespace std; struct point { int x; int y; }; vector<point> v[100010]; int n; int maxd; void dfs(int x,int y,int d) { if(d>maxd) maxd=d; for(int i=0;i<v[x].size();i++) { int nextt=v[x][i].x; if(nextt!=y) { dfs(nextt,x,d+v[x][i].y); } } } int main() { scanf("%d",&n); ll sum=0; maxd=0; for(int i=1;i<=n-1;i++) { int a; point u; scanf("%d%d%d",&a,&u.x,&u.y); a--; u.x--; sum+=(ll)u.y; v[a].push_back(u); swap(a,u.x); v[a].push_back(u); } sum*=2; dfs(0,-1,0); printf("%lld\n",sum-maxd); }