其中每个点有权值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