BZOJ4808 馬(最大獨立集,最大流)

2022-02-27 14:24:03 字數 1656 閱讀 8452

題意:其實就是找出乙個點集的子集,使得這個子集中的點互不相連。求這個子集規模最大。

就是最大獨立集。點好多,有200*200個。所以用dinic優化了下。

最大獨立集=n-最大匹配,最大匹配=最大流,所以最大獨立集=n-最大流。

1 #include 2

using

namespace

std;34

//下標從0開始

5 typedef struct

edge edge;89

const

int inf = 0x7f7f7f7f;10

const

int maxn = 400400;11

const

int maxm = 220;12

13int

cnt, dhead[maxn];

14int

cur[maxn], dd[maxn];

15 edge dedge[maxn<<1

];16

//bool vis[maxn];

//記錄經過的點

17int

s, t, n;

1819

void

init()

2425

void adde(int u, int v, int w, int c1=0

) 31

32bool bfs(int s, int t, int

n) 47}48

}49return0;

50}5152

int dinic(int s, int t, int

n) 65 flow +=tp;

66for(int i = top - 1; i >= 0; i--)

71 u =dedge[st[top]].u;72}

73else

if(cur[u] != -1 && dedge[cur[u]].w > 0 && dd[u] + 1 ==dd[dedge[cur[u]].v])

77else

81 cur[u] =dedge[cur[u]].next;82}

83}84}

85return

flow;86}

8788

const

int dx[11] = ;

89const

int dy[11] = ;

90int

n, m;

91int

mp[maxm][maxm];

9293 inline bool bound(int x, int y)

94 inline int id(int x, int y)

9596

intmain()

107}

108int tot = 0

;109

for(int i = 1; i <= n; i++)

119}

120}

121 printf("

%d\n

", tot - dinic(s, t, n)/2

);122

}123

return0;

124 }

樹的最大獨立集

include include includeusing namespace std ifstream fin c data19.in struct node int data int c int gc struct node parent struct node left struct node ...

樹的最大獨立集

題意 對於一棵有n個結點的無根樹,選出盡量多的結點,使得任何兩個結點均不相鄰 稱為最大獨立集 sol 樹形dp 由於每個點只由其兒子或者孫子決定 二者的最大值 所以我們可以深搜一遍,回溯的時候用當前節點更新其父親以及父親的父親 因為此時該節點的值已經被我們計算出來了 這種由已知貢獻給未知的方法稱為刷...

hdu 2768 最大獨立集

建圖很巧妙嗎,把每個孩子拆點,將有矛盾的兩個孩子之間連一條邊,當然還有反向邊,求出最大匹配 2 以為前面拆點且有反向邊所以求出最大匹配要除以2,然後用總人數減去即可 include include include define inf 0x3f3f3f3f define bug printf her...