标签:其他 n+1 pac 不能 ext closed lse gif 幸运
4 2 1 3 3 1 2 3 1 3 4 2 4 6
1 9
首先暴力算出一个以某个节点为根所需的能量,然后从这个点在dfs一次,推导出以其他n个点为根所需能量。
1 #include <cstdio> 2 using namespace std; 3 struct arr 4 { 5 int x,y,next; 6 long long w; 7 }; 8 arr edge[2000000]; 9 int ls[1000000],n,p[1000000],son[1000000],e; 10 long long s[1000000],minn; 11 bool f[1000000]; 12 int dfs(int x) 13 { 14 int i=ls[x]; 15 son[x]=1; 16 while (i!=0) 17 { 18 if (f[edge[i].y]) 19 { 20 f[edge[i].y]=false; 21 dfs(edge[i].y); 22 son[x]=son[x]+son[edge[i].y]; 23 s[x]=s[x]+s[edge[i].y]+(edge[i].w-p[x])*(son[edge[i].y]); 24 } 25 i=edge[i].next; 26 } 27 } 28 int bdfs(int x) 29 { 30 int i=ls[x]; 31 while (i!=0) 32 { 33 if (f[edge[i].y]) 34 { 35 int k=edge[i].y; 36 s[k]=s[x]-(edge[i].w-p[x])*(son[k]); 37 s[k]=s[k]+(edge[i].w-p[k])*(n-son[k]); 38 if (s[k]<minn||s[k]==minn&&k<e) 39 { 40 minn=s[k]; 41 e=k; 42 } 43 f[k]=false; 44 bdfs(k); 45 } 46 i=edge[i].next; 47 } 48 } 49 int main() 50 { 51 scanf("%d",&n); 52 for (int i=1;i<=n;i++) 53 scanf("%d",&p[i]); 54 for (int i=1;i<=n-1;i++) 55 { 56 scanf("%d%d%d",&edge[i*2-1].x,&edge[i*2-1].y,&edge[i*2-1].w); 57 edge[i*2-1].next=ls[edge[i*2-1].x]; 58 ls[edge[i*2-1].x]=i*2-1; 59 edge[i*2].x=edge[i*2-1].y; 60 edge[i*2].y=edge[i*2-1].x; 61 edge[i*2].w=edge[i*2-1].w; 62 edge[i*2].next=ls[edge[i*2].x]; 63 ls[edge[i*2].x]=i*2; 64 } 65 for (int i=1;i<=n;i++) 66 f[i]=true; 67 f[1]=false; 68 dfs(1); 69 for (int i=1;i<=n;i++) 70 f[i]=true; 71 f[1]=false; 72 minn=s[1]; 73 e=1; 74 bdfs(1); 75 printf("%d\n",e); 76 printf("%lld\n",minn); 77 }
标签:其他 n+1 pac 不能 ext closed lse gif 幸运
原文地址:https://www.cnblogs.com/Tokisaki-Kurumi/p/9477968.html