BZOJ1143 祭祀(網路流)

2021-08-18 02:59:57 字數 1796 閱讀 3239

bzoj

洛谷在遙遠的東方,有乙個神秘的民族,自稱y族。他們世代居住在水面上,奉龍王為神。每逢重大慶典, y族都

會在水面上舉辦盛大的祭祀活動。我們可以把y族居住地水系看成乙個由岔口和河道組成的網路。每條河道連線著

兩個岔口,並且水在河道內按照乙個固定的方向流動。顯然,水系中不會有環流(下圖描述乙個環流的例子)。

由於人數眾多的原因,y族的祭祀活動會在多個岔口上同時舉行。出於對龍王的尊重,這些祭祀地點的選擇必

須非常慎重。準確地說,y族人認為,如果水流可以從乙個祭祀點流到另外乙個祭祀點,那麼祭祀就會失去它神聖

的意義。族長希望在保持祭祀神聖性的基礎上,選擇盡可能多的祭祀的地點。

第一行包含兩個用空格隔開的整數n、m,分別表示岔口和河道的數目,岔口從1到n編號。

接下來m行,每行包含兩個用空格隔開的整數u、v,

描述一條連線岔口u和岔口v的河道,水流方向為自u向v。

n≤100m≤1000

第一行包含乙個整數k,表示最多能選取的祭祀點的個數。

4 4

1 2

3 4

3 2

4 22

【樣例說明】

在樣例給出的水系中,不存在一種方法能夠選擇三個或者三個以上的祭祀點。包含兩個祭祀點的測試點的方案有兩種:

選擇岔口1與岔口3(如樣例輸出第二行),選擇岔口1與岔口4。

水流可以從任意岔口流至岔口2。如果在岔口2建立祭祀點,那麼任意其他岔口都不能建立祭祀點

但是在最優的一種祭祀點的選取方案中我們可以建立兩個祭祀點,所以岔口2不能建立祭祀點。對於其他岔口

至少存在乙個最優方案選擇該岔口為祭祀點,所以輸出為1011。

最長反鏈覆蓋

看到這道題目的第一眼的思路

就覺得很類似於最小路徑覆蓋

但是我們發現這樣是錯的,

因為無法確定路徑的聯通關係

現在稍微改一下就行了,既然只要是聯通的就不能選了

那麼就把有邊直接相連,改為是否聯通

提前跑flo

yd處理一下再連邊就行了

(二分圖匹配也是可以的)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

#define rg register

#define max 555

#define inf 1000000000

inline

int read()

struct linee[max*max*4];

int h[max],cnt=2;

inline

void add(int u,int v,int w)

;h[u]=cnt++;

e[cnt]=(line);h[v]=cnt++;

}int level[max],s,t;

bool bfs()

return level[t];

}int dfs(int u,int flow)

}if(!ret)level[u]=0;

return ret;

}int dinic()

int n,m,g[max][max];

int main()

BZOJ 1066 蜥蜴 網路流

很普通的拆點網路流,把每個柱子拆成兩個點 i,j,0 和 i,j,1 對於柱子的高度限制則加邊 i,j,0 i,j,1 height 兩個柱子能互相到達則加邊 i,j,1 i1,j1,0 inf 能到達邊界的柱子加邊 i,j,1 t,inf 有蜥蜴的柱子加邊 s,i,j,0 1 跑一遍最大流,答案就...

bzoj1834(網路流 費用流)

給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1 在不擴容的情況下,1到n的最大流 2 將1到n的最大流增加k所需的最小擴容費用。第一問裸的網路流 第二問 新建乙個匯點,將n號點與匯點相連,容量為k,限制最多增大的流量 費用為0 將原先每一條邊都新...

bzoj1458 士兵占領 網路流

有乙個m n的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不能放置士兵。我們稱這些士兵占領了整個棋盤當滿足第i行至少放置了li個士兵,第j列至少放置了cj個士兵。現在你的任務是要求使用最少個數的士兵來占領整個棋盤。第一行兩個數m,n,k分別表示棋...