38 条题解

  • 0
    @ 2009-07-16 16:26:34

    用SAP瞬秒了。

  • 0
    @ 2009-06-30 22:00:29

    我是神牛!大家来膜拜我!!!!!

    • @ 2013-04-03 23:27:15

      你用不着**题题***发*吧!!

  • 0
    @ 2009-06-29 18:11:44

    直接用的连续增广的费用流程序,把所有边的费用设成1就成了SAP.

    不过这SAP也太慢了..

  • 0
    @ 2009-06-29 15:09:07

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 25ms

    ├ 测试数据 09:答案正确... 72ms

    ├ 测试数据 10:答案正确... 56ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:153ms

    SAP+GAP!没有秒杀。。。

    原来不属于任何动物的领地可以和和羊或者狼的领地相连,但不能使狼和羊通过这种领地相连。

    此题建模太重要了。相邻领地都有容量为1的边相连。

  • 0
    @ 2009-06-29 14:01:54

    膜拜楼下,看来得好好练练邻接表了

  • 0
    @ 2009-06-26 19:53:07

    对于我等初学者来说难度确实有4……

    AC了!

  • 0
    @ 2009-06-22 22:37:47

    30分飘过。。。。

  • 0
    @ 2009-06-22 17:01:58

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    太水了,sap就是强

  • 0
    @ 2009-06-22 11:54:17

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    膜拜SWJ神牛!

  • 0
    @ 2009-06-21 17:31:26

    这就是一个超级大水题啊!!!!

    不会的人肯定没学过oi啊!!!!!!

    很明显,这个题目有两大事物:狼和羊

    狼和羊要分割开,那很容易让人联想到最小割

    我们这样建图:

    1.从源向每一个羊连一条容量为正无穷的边,代表羊必须和源连在一起

    2.从每一头狼向汇连一条容量为正无穷的边,代表狼必须和汇连在一起

    这样就保证狼和羊分开!!!

    然后对于每两个相邻的格子,x,y连一条容量为1的边,如果这条边在最小割集中,代表这两个格子的公共边被设置了栅栏,注意这一条边必须是双向边,因为最小割只是正向割!!!!!

    所以这个图的任意一个割代表一种可行的方案,那最小的割就代表设置最少的栅栏使得羊和狼分开!!!!!!!!!!

    这个傻×题就这样被我解决了!!我是神牛!!!快来膜拜我!!!!!!

  • 0
    @ 2009-06-22 18:24:50

    ??????

    为什么要建双向边

  • 0
    @ 2009-06-21 17:43:42

    楼下傻×!

  • 0
    @ 2009-06-20 19:52:23

    楼下是神牛,我是傻×!

    Orz...

  • 0
    @ 2009-06-20 19:21:38

    水题一个。。

    楼下太傻×了。。

    不愧是“假傻×”

  • 0
    @ 2009-06-20 18:24:07

    牛题,没想法……

    看了标程,应该是最小割……

    看懂了……

    Orz,居然没想到,最小割建模能力太差……

    提示一下:

    S={s, 羊领地}

    T={t, 狼领地}

  • 0
    @ 2009-06-20 16:24:52

    此题不容易。O(∩_∩)O~

  • -1
    @ 2016-03-18 19:22:22

    #include<cstdio>
    #include<cstring>
    #include<algorithm>

    using namespace std;

    const int maxn = 10009;
    const int INF = 100000000;

    struct edge {
    int to, cap;
    edge *next, *rev;
    } E[100000], *pt = E, *head[maxn];

    inline void add(int u, int v, int w) {
    pt->to = v; pt->cap = w; pt->next = head[u]; head[u] = pt++;
    }
    inline void addedge(int u, int v, int w) {
    add(u, v, w); add(v, u, 0);
    head[u]->rev = head[v];
    head[v]->rev = head[u];
    }

    edge *p[maxn], *cur[maxn];
    int cnt[maxn], h[maxn], mp[109][109], S, T, N;

    int maxFlow() {
    for(int i = 0; i < N; i++) cur[i] = head[i];
    memset(cnt, 0, sizeof cnt); cnt[0] = N;
    memset(h, 0, sizeof h);
    int flow = 0;
    edge* e;
    for(int A = INF, x = S; h[S] < N; ) {
    for(e = cur[x]; e; e = e->next)
    if(h[e->to] + 1 == h[x] && e->cap) break;
    if(e) {
    p[e->to] = cur[x] = e;
    A = min(A, e->cap);
    x = e->to;
    if(x == T) {
    flow += A;
    for(; x != S; x = p[x]->rev->to) {
    p[x]->cap -= A;
    p[x]->rev->cap += A;
    }
    A = INF;
    }
    } else {
    if(!--cnt[h[x]]) break;
    h[x] = N;
    for(e = head[x]; e; e = e->next) if(e->cap && h[e->to] + 1 < h[x]) {
    h[x] = h[e->to] + 1;
    cur[x] = e;
    }
    cnt[h[x]]++;
    if(x != S) x = p[x]->rev->to;
    }
    }
    return flow;
    }

    #define id(i, j) ((i) * m + (j))
    void init() {
    int n, m; scanf("%d%d", &n, &m);
    S = n * m; T = S + 1; N = T + 1;
    for(int i = 0; i < n; i++)
    for(int j = 0; j < m; j++)
    scanf("%d", mp[i] + j);
    for(int i = 0; i < n; i++)
    for(int j = 0; j < m; j++) {
    if(mp[i][j] == 1) addedge(S, id(i, j), INF);
    if(mp[i][j] == 2) addedge(id(i, j), T, INF);
    if(i - 1 >= 0 && (mp[i][j] != mp[i - 1][j] || !(mp[i][j] | mp[i - 1][j])))
    addedge(id(i, j), id(i - 1, j), 1);
    if(i + 1 < n && (mp[i][j] != mp[i + 1][j] || !(mp[i][j] | mp[i + 1][j])))
    addedge(id(i, j), id(i + 1, j), 1);
    if(j - 1 >= 0 && (mp[i][j] != mp[i][j - 1] || !(mp[i][j] | mp[i][j - 1])))
    addedge(id(i, j), id(i, j - 1), 1);
    if(j + 1 < m && ((mp[i][j] != mp[i][j + 1]) || !(mp[i][j] | mp[i][j+ 1])))
    addedge(id(i, j), id(i, j + 1), 1);
    }
    }

    int main() {

    init();
    printf("%d\n", maxFlow());

    return 0;
    }

  • -1
    @ 2009-08-15 13:53:20

    水题

    MD 太简单了!

信息

ID
1555
难度
6
分类
图结构 | 网络流 点击显示
标签
递交数
757
已通过
225
通过率
30%
被复制
2
上传者