還是那個經典trick:最大價值=總價值-最小花費
每個位置都是二選一,考慮乙個魚刺型建圖。
然後就是需要描述乙個,如果 \(x\) 選了第 \(p\) 種方案,那麼如果它的鄰點也選了第 \(p\) 種方案,就有 \(-c\) 的代價,也就是有一條 \(-c\) 流量的邊需要割掉。
但是如果直接 \(s\) 連向每個格仔的邊流量為 \(a\),每個格仔流向 \(t\) 的格仔流量為 \(b\),你會發現這個限制描述不了。
注意到網格圖四聯通實際上是個二分圖,按照格仔的橫縱座標和的奇偶性分類就是個二分圖。
那麼將橫縱座標和為偶數的格仔,連邊變成 \((s,x,b),(x,t,a)\),然後限制的話直接在鄰點之間連 \((x,y,c_x+c_y),(y,x,c_x+c_y)\) 流量的邊,這樣如果 \(x\) 和其鄰點 \(y\) 如果選擇了同樣的一種方案,那麼就需要付出 \(c_x+c_y\) 的代價。
這樣用總價值減去最小割就可以了。
#include#include#include#include#include#define pb emplace_back
#define mp std::make_pair
#define fi first
#define se second
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef std::pairpii;
typedef std::vectorvi;
const ll mod = 998244353;
ll add(ll x, ll y)
ll mul(ll x, ll y)
ll mod(ll x)
ll cadd(ll &x, ll y)
ll cmul(ll &x, ll y)
template t max(t x, t y)
templatet max(t x, t2 ...y)
template t min(t x, t y)
templatet min(t x, t2 ...y)
template t cmax(t &x, t y)
template t cmin(t &x, t y)
template t &read(t &r)
templatevoid read(t1 &x, t2& ...y)
const int n = 5010;
const int m = 10010;
const ll inf = 0x7fffffffffffffff;
int n, m, a[110][110], b[110][110], c[110][110], p[110][110];
int tot, s, t, ent = 1, head[n], cur[n], dis[n];
struct edge e[m << 1];
inline void add(int x, int y, int z)
bool bfs()
} }return dis[t] != -1;
}ll dfs(int x, ll lim)
} return flow;
}ll dinic()
signed main()
else
sum += a[i][j] + b[i][j];
if(p[i-1][j])
if(p[i+1][j])
if(p[i][j-1])
if(p[i][j+1])
} printf("%lld\n", sum - dinic());
return 0;
}
洛谷 P1935 國家集訓隊 圈地計畫 最小割
題目描述 最近房地產商gdoi group of dumbbells or idiots 從noi nuts old idiots 手中得到了一塊開發土地。據了解,這塊土地是一塊矩形的區域,可以縱橫劃分為n m塊小區域。gdoi要求將這些區域分為商業區和工業區來開發。根據不同的地形環境,每塊小區域建...
洛谷 P1505 國家集訓隊 旅遊
洛谷傳送門 ray 樂忠於旅遊,這次他來到了 t 城。t 城是乙個水上城市,一共有 nn 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有 n 1n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人...
題解 洛谷P1407 國家集訓隊 穩定婚姻
題面 很好的 tarjan 練習題。主要講一下如何建圖。先用 stl map 把每個人的名字對映成數字。輸入第 i 對夫妻時把女性對映成 i 把男性對映成 i n 輸入相互喜歡過的情侶時將男性向女性連邊。然後 tarjan 判斷 i 與 i n 是不是在同乙個強連通分量裡即可。今天是七夕節誒 inc...