POJ 1273 网络流(最大流)模板
http://poj.org/problem?id=1273
这道题很值得反思,弄了一下午,交上去先是一直编译错误,而在本地运行没有问题,
原因可能是oj的编译器版本老旧不支持这样的写法
G[from].push_back((edge){to,cap,G[to].size()});
G[to].push_back((edge){from,0,G[from].size() - 1});
这两句交上去是不能通过的,不知道网上很多人这样子贴出代码是怎样通过的(‘白书’的模板有问题的)
如果是照着‘白书’直接敲上去没有提交试试的话就太不应该了
正确的写法:
struct edge edge1={to,cap,G[to].size()} ;
G[from].push_back(edge1);
struct edge edge2={from,0,G[from].size()-1};
G[to].push_back(edge2);
解决了这个问题以后就开始一直WA
原因:虽然记得给数组memset了,但是vector忘记初始化,使得后面的结果出错
这些教训要接受
#include <iostream> #include <queue> #include <vector> #include <string.h> #define MAXN 205 #define oo 0x3f3f3f3f using namespace std; struct edge { int to;//终点 int cap;//容量 int rev;//反向边 }; vector <edge> G[MAXN]; int level[MAXN];//顶点到源点的距离编号 int iter[MAXN];//当前弧,在其之前的边不用再考虑 void add_edge(int from,int to,int cap)//增加s->t容量cap的边 { struct edge edge1={to,cap,G[to].size()} ; G[from].push_back(edge1); struct edge edge2={from,0,G[from].size()-1}; G[to].push_back(edge2); } //bfs用来计算从源点出发所有点的距离编号 void bfs(int s) { memset(level, -1, sizeof(level)); queue<int> que; level[s] = 0; que.push(s); while (!que.empty()) { int v = que.front(); que.pop(); for (int i = 0; i < G[v].size(); i++) { edge &e = G[v][i]; if (e.cap > 0 && level[e.to] < 0) { level[e.to] = level[v] + 1; que.push(e.to); } } } } //通过DFS寻找当前的最短的增广路 int dfs(int v, int t, int f) { if (v == t) return f; for (int &i = iter[v]; i < G[v].size(); i++) {//这里用引用,巧妙地修改了iter数组 edge &e = G[v][i]; if (e.cap > 0 && level[v] < level[e.to]) {//level[v] < level[e.to]这个条件保证了当前的增广路是最短的 int d = dfs(e.to, t, min(f, e.cap)); if (d > 0) { e.cap -= d; G[e.to][e.rev].cap += d; return d; } } } return 0; } int max_flow(int s, int t) { int flow = 0; for(;;) { bfs(s); if (level[t] < 0) return flow; memset(iter, 0, sizeof(iter)); int f; while ((f = dfs(s, t, oo)) > 0) { flow += f; } } } void init() { for(int i = 0; i < MAXN; i++) { G[i].clear(); } } int main() { int n,m,s,e,c,i; while(scanf("%d%d",&n,&m)!=EOF) { init(); for(i=1;i<=n;i++) { scanf("%d%d%d",&s,&e,&c); add_edge(s,e,c); } cout<<max_flow(1,m)<<endl; } return 0; }