題意:其實就是找出乙個點集的子集,使得這個子集中的點互不相連。求這個子集規模最大。
就是最大獨立集。點好多,有200*200個。所以用dinic優化了下。
最大獨立集=n-最大匹配,最大匹配=最大流,所以最大獨立集=n-最大流。
1 #include 2using
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...