| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:找到错了!!In Reply To:求数据,dinic死活不过 Posted by:zpclinux at 2012-08-13 11:50:19 > 用ek就过了
> 我的dinic,求指点错误:
> int bfs(int s, int t, int start, int end)
> {
> int front, rear, q[NN*3];
> int u, v;
> memset(level, 0, sizeof(level));
> front = rear = 0;
> level[s] = 1;
> q[rear++] = s;
> while (front < rear) {
> u = q[front++];
> if (u == t) return 1;
> for (v = start; v <= end; v++) {
> if (map[u][v] && !level[v]) {
> q[rear++] = v;
> level[v] = level[u] + 1;
> }
> }
> }
> return 0;
> }
>
> int dfs(int s, int t, int start, int end, int tf)
> {
> int u, v, dt, maxFlow = 0;
> u = s;
> if (u == t) return tf;
> for (v = start; v <= end; v++) {
> if (map[u][v] != 0 && map[u][v] < INF && level[v] == level[u] + 1) {
> dt = dfs(v, t, start, end, MIN(map[u][v], tf));
> map[u][v] -= dt;
> map[v][u] += dt;
> maxFlow += dt;
> if (dt == tf) return maxFlow;
> }
> }
> return maxFlow;
> }
>
> int dinic(int s, int t, int start, int end)
> {
> int maxflow = 0;
> while (bfs(s, t, start, end)) {
> maxflow += dfs(s, t, start, end, INF);
> }
> return maxflow;
> }
在dfs中maxFlow+=dt;后边还要加上tf-=dt;
这里因为在一层向下扩展时,找到一条路后计算出该路的dt而此层的向下扩展并未结束,因为for循环还可能找到其它的路,这样tf变量记录的可行流就必须得减去已经增广的值 tf-=dt。否则将出现给定的流小于搜索到的可以增广的值。
举个例子: 5个结点5条边的一个图, 1号源点,5号汇点
1 2 5
2 3 3
2 4 4
3 5 3
4 5 4
对这个图来说,假如不进行tf-=dt最终得到的流将是7,即由2到3到5的3 和 2到4到5的4 加一起为7
但事实上由1到2给的流量才只有5.
可气的是我的这个dinic写法交到ditch那道题上却被ac了。。害死人了
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator