题目
题意:
有一个树形电网,要在某个节点建一个发电站,传输损耗是 I^2*Ri,Ri是总的电阻, 跟到各点距离总和有关。I是常数。
问最小的损耗,并输出最优的节点。
解法:
DFS两次统计每个点到其它点的距离总和即可。
Time:125ms Memory:5216KB Length:2039B #include #include #include #include #include #include #include #include #include #include #include #include #define DBLE 1e-8 #define PI 3.1415926535898 #define INF (100000000000LL) #define MAXN 100010 #define MP(x,y) (make_pair((x),(y))) #define FI first #define SE second using namespace std; int he[MAXN],to[MAXN],nex[MAXN],top,node[MAXN]; long long num[MAXN],ans; vector vec; void add(int a,int b) { nex[top]=he[a]; to[top]=b; he[a]=top++; } pair dfs1(int h,int fa) { node[h]=1; pair pa; for(int i=he[h];i!=-1;i=nex[i]) if(to[i]!=fa) { pa=dfs1(to[i],h); node[h]+=pa.FI; num[h]+=pa.SE+pa.FI; } return MP(node[h],num[h]); } void dfs2(int h,int fa,pair pa) { pair tpa=pa,ttpa; num[h]+=pa.SE+pa.FI; if(num[h]<=ans) { if(num[h]