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 |
自问自答了In Reply To:请问为什么会出现这种情况??? Posted by:fishyuze at 2007-03-27 20:36:11 > 我用bfs写的增广路径,重边也考虑了, 数组开210也够大,但是交上去是RE > 我怀疑是数组开小了, 于是开了个500的,就变TLE了.不知道是怎么一回事,请大牛赐教. > 附代码: > #include <iostream> > #include <queue> > > using namespace std; > #include "memory.h" > #define MAX 210 > int cap[MAX][MAX], f[MAX][MAX], path[MAX], cf[MAX][MAX];//f流值,cf残留网络,cap容量 > int len, n, m; > bool u[MAX];//是否访问过的标记 > int bfs(int from) > { > int min = 99999999, i; > std::queue<int> q; > q.push(from); > u[0] = true; > > while(!q.empty()) > { > int next = q.front(); > q.pop(); > > if(next == n - 1) > { > for(i = n - 1; path[i] != -1; i = path[i]) > { > min = min > cf[path[i]][i] ? cf[path[i]][i]:min; > } > return min; > } > for(i = 1; i <= n - 1; i++) > { > if(!u[i] && cf[next][i] > 0) > { > q.push(i); > u[i] = true; > path[i] = next; > } > } > } > return 0; > } > /* > int dfs(int from) > { > int i; > if(from == n) > { > int min = 99999999; > for(i = n; path[i] != -1; i = path[i]) > { > min = min > cf[path[i]][i] ? cf[path[i]][i]:min; > } > return min; > } > u[from] = true; > for(i = 0; i <= n; i++) > { > if(!u[i] && cf[from][i] > 0) > { > u[i] = true; > path[i] = from; > int flow = dfs(i); > if(flow > 0) return flow; > path[i] = -1; > u[i] = false; > } > } > return 0; > }*/ > void solve() > { > int min, i; > memset(u, false, sizeof(u)); > memset(path, -1, sizeof(path)); > while((min = bfs(0)) != 0) > { > for(i = n - 1; i != -1; i = path[i])/////////////就这错了应该是path[i]!=-1 > { > //int from = path[i]; > f[path[i]][i] += min; > f[i][path[i]] -= min; > if(f[path[i]][i] > 0) > { > cf[i][path[i]] = f[path[i]][i]; > cf[path[i]][i] = cap[path[i]][i] - f[path[i]][i]; > } > } > memset(u, false, sizeof(u)); > memset(path, -1, sizeof(path)); > } > __int64 maxflow = 0; > for(i = 1; i <= n - 1; i++) > { > maxflow += f[0][i]; > } > printf("%I64d\n", maxflow); > } > void makemap() > { > //建图,初始化容量矩阵以及残留网络,确定顶点个数n > memset(f, 0, sizeof(f)); > memset(cap, 0, sizeof(cap)); > memset(cf, 0, sizeof(cf)); > int i, s, e, c; > for(i = 1; i <= m; i++) > { > cin >> s >> e >> c; > if(cap[s-1][e-1] == 0) cap[s-1][e-1] = cf[s-1][e-1] = c; > else cap[s-1][e-1] = cf[s-1][e-1] += c;//重边 > } > } > int main() > { > //freopen("in.txt", "r", stdin); > while(cin >> m >> n) > { > makemap(); > solve(); > } > return 0; > } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator