國家集訓隊 部落戰爭

2022-05-09 10:39:37 字數 1403 閱讀 5425

嘟嘟嘟

這其實就是一道最小邊覆蓋的板兒題。

暴力連邊,然後跑匈牙利(dinic),則答案就是總結點數-匹配數。

比如節點1和2,2和3匹配上了,那麼就是1到2,2到3這兩條路徑連線到一塊,相當於把節點3合併到這條路徑上了。所以從路徑數就是總結點數-連線次數。

然而我不知怎麼想的寫了個費用流,雖然正確性是對的,但是因為是一條條增廣路找,就慢了很多……

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define enter puts("")

#define space putchar(' ')

#define mem(a, x) memset(a, x, sizeof(a))

#define in inline

typedef long long ll;

typedef double db;

const int inf = 0x3f3f3f3f;

const db eps = 1e-8;

const int maxn = 55;

const int maxn = 5e3 + 5;

const int maxe = 1e7 + 5;

inline ll read()

inline void write(ll x)

char s[maxn][maxn];

int n, m, r, c, t;

struct edge

e[maxe];

int head[maxn], ecnt = -1;

in void addedge(int x, int y, int w, int c)

; head[x] = ecnt;

e[++ecnt] = (edge);

head[y] = ecnt;

}bool in[maxn];

int dis[maxn], pre[maxn], flow[maxn];

in bool spfa()

} }

return dis[t] ^ inf;

}int mincost = 0;

in void update()

mincost += flow[t] * dis[t];

}in int mcmf()

int dx[5], dy[5], dir;

in void init()

else

}in int num(int x, int y, int z)

in void build(int x, int y)

}int main()

國家集訓隊 部落戰爭

差不多就是dag最小路徑覆蓋吧 拆點連邊。不會的可以看看蒟蒻的這個關於網路流的小總結qwq 最小路徑覆蓋 不相交 節點個數 最大匹配 但是要注意的是這個題的節點個數不能算高山深澗的點,因為它本來就非法,自己就構不成乙個路徑。如下 include include include include inc...

P2172 國家集訓隊 部落戰爭 網路流

戳這裡 題目相當於給定一張dag,求最少路徑覆蓋,這不就是網路流24題裡的那個最小路徑覆蓋的弱化版嗎?根據題意和最小路徑覆蓋的那個題的方法,我們把每乙個小鎮拆成入點和出點兩個,然後每乙個入點向能到達的小鎮的出點連邊,流量為 1 同時原點向每乙個小鎮的入點連邊,每乙個小鎮的出點向匯點連一條邊,流量都為...

洛谷P2172 國家集訓隊 部落戰爭 題解

不要被 國家集訓隊 的標籤嚇到,其實這題不是很難。本題可以對比p4304 tjoi2013 攻擊裝置 互不攻擊的網路流問題來想。這道題唯一新增的條件就是只能從上往下征戰,於是我們就從8個方向縮減到了四個放向,哪四個呢?aa 1 r bb 1 c aa 2 r bb 2 c aa 3 c bb 3 r...