此題與「文理分科」那道題目有些類似。都是使用最小割來求解,先加上可能獲得的權值,在減掉必須捨棄的權值(最小割)。
文理分科是規定每個人和 s 連就是選文,和 t 連就是選理。然後如果乙個人和相鄰的人都全文就會獲得乙個權值,那麼我們就為這個權值建乙個點,讓這個點與必須同時選文的5個人連 inf 邊。這樣只要這 5 個人中有乙個人選了理,就必須捨棄這個權值了。
再回到這道題目,這道題獲得權值的條件是這個點被控制或這個點相鄰的 4 個點都被控制。 這個「或」並不太好處理,我們就把這個條件拆成兩個不相交的條件:
1)這個點被控制,可以獲得權值。
2)這個點沒有被控制且相鄰的4個點都被控制,可以獲得權值。
這樣的話第乙個條件就是不控制這個點需要付出的代價,第二個條件是「這個點沒有被控制且相鄰的4個點都被控制」,只要有乙個點不符合就要割掉這個權值。
但是這些需要同時滿足的條件有「被控制」和「不被控制」,直接用「文理分科」的建圖方式是方向不一致的。
所以我們利用矩陣可以黑白染色成為二分圖的性質,將矩陣的格仔黑白染色之後,對於白點和黑點用相反的方式連邊,這樣黑點的「被控制」和白點的「不被控制」就是乙個方向的了。
注意剛開始時預先加到答案裡的權值是給定權值的兩倍,因為我們將權值分成了兩種情況。
#include #include #include #include #include #include using namespace std;inline int gmin(int a, int b)
const int maxmap = 50 + 5, maxn = 5000 + 5, maxm = 100000 + 5, inf = 999999999;
const int dx[5] = , dy[5] = ;
int n, m, nm, tot, ans, s, t;
int f[maxmap][maxmap], a[maxmap][maxmap], b[maxmap][maxmap], d[maxn], num[maxn];
struct edge
e[maxm], *p = e, *point[maxn], *last[maxn];
inline void addedge(int x, int y, int z)
inline bool inside(int x, int y)
int dfs(int now, int flow)
if (d[s] >= tot) return ret;
if (--num[d[now]] == 0) d[s] = tot;
++num[++d[now]];
last[now] = point[now];
return ret;
}int main()
tot = 2 * nm; s = ++tot; t = ++tot;
int x, y;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
}else
}} memset(d, 0, sizeof(d));
memset(num, 0, sizeof(num)); num[0] = tot;
for (int i = 1; i <= tot; ++i) last[i] = point[i];
while (d[s] < tot) ans -= dfs(s, inf);
printf("%d\n", ans);
return 0;
}
BZOJ 3774 最優選擇
題意 小n手上有乙個n m的方格圖,控制某乙個點要付出aij的代價,然後某個點如果被控制了,或者他周圍的所有點 上下左右 都被控制了,那麼他就算是被選擇了的。乙個點如果被選擇了,那麼可以得到bij的回報,現在請你幫小n選乙個最優的方案,使得回報 代價盡可能大。一眼是最小割,然後建邊的時候就糊塗了 首...
BZOJ 3774 最優選擇 最小割
驚了我竟然排rank 2,鹹魚有朝一日也能翻身。1a 先留個坑 include include include using namespace std const int n 5005,m n 10,inf 0x3f3f3f3f namespace graph bool bfs return lev...
最優選擇最小頻移鍵控(MSK)
最小頻移鍵控 msk 在數字調製中,最小頻移鍵控 msk 是一種在20世紀50年代末和60年代開發的連續相位頻移鍵控。與oqpsk類似,msk使用在正交分量之間交替的位元進行編碼,其中q分量延遲了符號週期的一半。然而,代替oqpsk使用的方波脈衝,msk將每個位編碼為半正弦波。這導致恆模數訊號 恆定...