一点小疑惑
查看原帖
一点小疑惑
970336
MagicLyney_06楼主2023/11/9 16:36

我建好了边,可是应该怎么改变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);}

其中 haxhax 表示这个名字是第几个人,mpmp 表示该名字的坐标。

2023/11/9 16:36
加载中...