我建好了边,可是应该怎么改变Dinic才行啊。 Dinic:
inline int dfs(int x, LL sumflow){
if (x == t) return sumflow;
LL res, ret = 0;
for (int i = temp[x]; i && sumflow; i = Next[i]){
temp[x] = i;
if (w[i] > 0 && (d[ver[i]] == d[x] + 1)){
res = dfs(ver[i], min(sumflow, w[i]));
if (!res) d[ver[i]] = INF;
w[i] -= res;
w[i ^ 1] += res;
ret += res;
sumflow -= res;
}
}
return ret;
}
建边:
string name1, name2;
cin >> name1;
while (name1 != "End"){
cin >> name2;cin >> ww;
deals(name1);deals(name2);
int xx = mp[name1].first, xy = mp[name1].second, yx = mp[name2].first, yy = mp[name2].second;
if ((xx - yx) * (xx - yx) + (xy - yy) * (xy - yy) <= k * k){
int man = hax[name1], woman = hax[name2];
if (man > woman) swap(man, woman);
add(man, woman, 1);add(woman, man, -ww);
love[man][woman] = ww;
}
cin >> name1;
}
for (int i = 1; i <= n; i++){
for (int j = n + 1; j <= n * 2; j++){
if (!love[i][j]){
int xx = mp[name[i]].first, xy = mp[name[i]].second, yx = mp[name[j]].first, yy = mp[name[j]].second;
if ((xx - yx) * (xx - yx) + (xy - yy) * (xy - yy) <= k * k)
add(i, j, 1), add(j, i, -1);
love[i][j] = 1;
}
}
}
s = n * 2 + 1;t = n * 2 + 2;
for (int i = 1; i <= n; i++) add(s, i, 1), add(i, s, 0);
for (int i = n + 1; i <= n * 2; i++) add(i, t, 1), add(t, i, 0);
while (bfs()) {ans += dfs(s, INF);}
其中 hax 表示这个名字是第几个人,mp 表示该名字的坐标。