HDU - 3605 Escape 状态压缩最大流
发布日期:2021-05-10 11:28:43 浏览次数:14 分类:精选文章

本文共 3455 字,大约阅读时间需要 11 分钟。

���������������������������������������������n���������������������������������������������n���������m������������������������������������������������������������������������������������������������������Dinic������������������

������������������������������������������������s���������������������������������t���������������������������������������������������������������������������������������1������������������������������������t������������������������������

������m���������10������������������������������1024���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������t������������������������������

���������������������������������������������Dinic������������������������������������������1������������1000���������Dinic���������������������������������

���������������������������������������������������������������������������������������������������������������������������������������n������������0���

������������������������������������������������������������������������������������������������

������

#include 
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std; typedef long long ll; const int inf = 0x3f3f3f3f; const int maxn = 100000; // ������������������ const int maxe = 250000; // ������������ struct Edge { int v; int w; int next; }; int head[maxn], cnt; long long maxflow; int s, t; void init() { memset(head, -1, sizeof(head)); cnt = 0; maxflow = 0; } void add(int u, int v, int w) { edge[cnt].v = v; edge[cnt].w = w; edge[cnt].next = head[u]; head[u] = cnt++; } inline bool bfs() { memset(deep, 0x3f, sizeof(deep)); queue q; q.push(s); deep[s] = 0; now[s] = head[s]; while (!q.empty()) { int x = q.front(); q.pop(); for (int i = head[x]; i != -1; i = edge[i].next) { int y = edge[i].v; if (edge[i].w > 0 && deep[y] == inf) { q.push(y); now[y] = head[y]; deep[y] = deep[x] + 1; if (y == t) return true; } } } return false; } ll dfs(int x, int flow) { if (x == t) return flow; ll ans = 0; for (int i = now[x]; i != -1; i = edge[i].next) { int y = edge[i].v; if (edge[i].w > 0 && deep[y] == deep[x] + 1) { ll k = dfs(y, min(flow, edge[i].w)); if (k == 0) deep[y] = inf; edge[i].w -= k; edge[edge[i].next].w += k; ans += k; flow -= k; } } return ans; } void dinic() { while (bfs()) { maxflow += dfs(s, inf); } } int sta[1024]; int main() { while (scanf("%d %d", &n, &m) == 2) { memset(sta, 0, sizeof(sta)); s = 1000; t = s + 1; init(); for (int i = 1; i <= n; ++i) { int tmp = 0, fg; for (int j = 1; j <= m; ++j) { scanf("%d", &fg); if (fg) tmp |= (1 << (j-1)); } sta[tmp]++; } for (int i = 1; i <= m; ++i) { add(s, 2 + i, sta[0]); add(1000 + i, t, 0); } for (int i = 1; i <= 1023; ++i) { if (sta[i] > 0) { add(s, 1000 + (i < m) ? ( (i >> 0) ) : 0, sta[i] ); } } dinic(); if (maxflow == n) printf("Yes\n"); else printf("No\n"); } }

������

  • ���������������������s������������������������������������������������������������������������������������������t���
  • ���������������������1024���������������������������������������������1������������1000���
  • Dinic���������������������������������������������������������������
  • ������������������������������������������������������������������������������������������������

    上一篇:起床困难综合症 Acwing 98 按位枚举
    下一篇:HDU - 2732 Leapin‘ Lizards 拆点最大流+BFS 学好英语QAQ

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年04月12日 05时50分43秒