38 条题解
-
0boboo LV 8 @ 2009-07-16 16:26:34
用SAP瞬秒了。
-
02009-06-30 22:00:29@
我是神牛!大家来膜拜我!!!!!
-
02009-06-29 18:11:44@
直接用的连续增广的费用流程序,把所有边的费用设成1就成了SAP.
不过这SAP也太慢了.. -
02009-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 有效耗时:153msSAP+GAP!没有秒杀。。。
原来不属于任何动物的领地可以和和羊或者狼的领地相连,但不能使狼和羊通过这种领地相连。
此题建模太重要了。相邻领地都有容量为1的边相连。 -
02009-06-29 14:01:54@
膜拜楼下,看来得好好练练邻接表了
-
02009-06-26 19:53:07@
对于我等初学者来说难度确实有4……
AC了! -
02009-06-22 22:37:47@
30分飘过。。。。
-
02009-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就是强 -
02009-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神牛!
-
02009-06-21 17:31:26@
这就是一个超级大水题啊!!!!
不会的人肯定没学过oi啊!!!!!!
很明显,这个题目有两大事物:狼和羊
狼和羊要分割开,那很容易让人联想到最小割
我们这样建图:
1.从源向每一个羊连一条容量为正无穷的边,代表羊必须和源连在一起
2.从每一头狼向汇连一条容量为正无穷的边,代表狼必须和汇连在一起
这样就保证狼和羊分开!!!
然后对于每两个相邻的格子,x,y连一条容量为1的边,如果这条边在最小割集中,代表这两个格子的公共边被设置了栅栏,注意这一条边必须是双向边,因为最小割只是正向割!!!!!所以这个图的任意一个割代表一种可行的方案,那最小的割就代表设置最少的栅栏使得羊和狼分开!!!!!!!!!!
这个傻×题就这样被我解决了!!我是神牛!!!快来膜拜我!!!!!! -
02009-06-22 18:24:50@
??????
为什么要建双向边 -
02009-06-21 17:43:42@
楼下傻×!
-
02009-06-20 19:52:23@
楼下是神牛,我是傻×!
Orz... -
02009-06-20 19:21:38@
水题一个。。
楼下太傻×了。。
不愧是“假傻×” -
02009-06-20 18:24:07@
牛题,没想法……
看了标程,应该是最小割……
看懂了……
Orz,居然没想到,最小割建模能力太差……
提示一下:
S={s, 羊领地}
T={t, 狼领地} -
02009-06-20 16:24:52@
此题不容易。O(∩_∩)O~
-
-12016-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;
} -
-12009-08-15 13:53:20@
水题
MD 太简单了!