其中每个点有权值Vi, 每条边有权值Eij
若点在子图中则利益P-Vi
若边在子图中则利益P+Eij, 否则不在, 利益P-Eij(若该边有1个节点在子图中则对利益无影响)
举例
..:
点权值{2, 2}
边权值{{0, 1}, {1, 0}}
那么最大P就是空子图, P=-1
观察
..:
初始利益是-S(E)
对任一节点i, 若选入则增加-Vi+S(Eij)利益, S(Eij)是与i相连所有边权和
这样想是不会出现重复计算的, 即每个点是否选入不相干
因为对任意边, 选一个节点增加E, 再选一个又增加E
写出代码
..:
#include <bits/stdc++.h> using namespace std; int n, s, r; class EmployManager { public: int maximumEarnings(vector<int> v, vector<string> e) { n=v.size(); for (int i=0; i<n; i++) for (int j=i+1; j<n; j++) r-=e[i][j]-'0'; for (int i=0; i<n; i++) { s=0; for (int j=0; j<n; j++) s+=e[i][j]-'0'; if (s-v[i]>0) r+=s-v[i]; } return r; } };
No comments :
Post a Comment