嘟嘟嘟
這其實就是一道最小邊覆蓋的板兒題。
暴力連邊,然後跑匈牙利(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...