| ||||||||||
| 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 | |||||||||
请问为什么会出现这种情况???我用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])
{
//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