简单 最小生成树 将变转化为 Li=2*Li+Si+EI 因为那个人还要走回来 这样变化就能够计算出 来回要花费的时间 然后进行一次最小生成树
#include <iostream> #include <string.h> #include <cstdio> #include <algorithm> using namespace std; const int maxn=10005; const int maxm=100005; struct edge{ int x,y; long long W; }E[maxm]; int F[maxn]; long long N[maxn],maxv; int father(int a){ return a==F[a]?a:F[a]=father(F[a]); } bool cmp(const edge A,const edge B){ return A.W<=B.W; } int main() { int n,m; while(scanf("%d%d",&n,&m)==2){ maxv=10000000; for(int i=1;i<=n;i++) F[i]=i; for(int i=1;i<=n;i++){ cin>>N[i]; maxv=maxv>N[i]?N[i]:maxv; } for(int i=0;i<m;i++){ cin>>E[i].x>>E[i].y>>E[i].W; E[i].W=E[i].W*2+N[E[i].x]+N[E[i].y]; } sort(E,E+m,cmp); int L=n; for(int i=0;i<m;i++){ int u=father(E[i].x),v=father(E[i].y); if(u!=v){ L--; maxv+=E[i].W;F[u]=v;} if(L==1) break; } cout<<maxv<<endl; } return 0; }