您的位置:首页 > 其它

poj1273

2013-11-19 23:16 120 查看
这是一道网络流模板题,我却10次没有A掉,其中包括2个MLE,3个RE,2个CE。今天真的不适宜敲代码。

说点感想:好累!今天晚上本是集训的时间,又是回宿舍了,洗了洗衣服。白天写了两篇论文,说是论文,也就是受力分析了一下,列了个微分方程,做了个拉普拉斯变换,用simulink仿真了一下,用Matlab画了画频响图和波特图,分析了下曲线。没什么创新性可言,这种论文肯定发出去没人要,有人要也是这个杂志社缺稿子了。。另外一篇是帮啸爷找了找资料,让他在比赛前先别让这些事情烦心。明天又是满满一天的课,很难熬。电路十四周考试,还两周,恐怕这两周又没法安下心来敲代码了,原谅我。

鼓励自己的话:要想比别人好,就得比别人努力的多。

说多了,这个题目的代码主体部分是抄的别人的,mark一下,现在安不下心来学这个算法,过了也不是自己的东西,又有何用?!

美其名曰借鉴,实则抄袭,这样怎么能做好?!

请看到这篇文章的读者自行搜索解题报告吧,这里提供一下抄袭的代码:

#include <iostream>

#include <queue>

#include <vector>

#include <string.h>

#define MAXN 205

#define oo 0x3f3f3f3f

using namespace std;

struct edge { int to, cap, rev; };

vector <edge> G[MAXN];

int level[MAXN];//顶点到源点的距离编号

int iter[MAXN];//当前弧,在其之前的边不用再考虑

void add_edge(int from, int to, int cap)

{

edge from_edge, to_edge;

from_edge = { to, cap, G[to].size() };

to_edge = { from, 0, G[from].size() - 1 };

G[from].push_back(from_edge);

G[to].push_back(to_edge);

}

//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;

while (cin >> n >> m)

{

init();

for (int i = 0; i < n; i++)

{

int a, b, c;

cin >> a >> b >> c;

add_edge(a, b, c);

}

cout << max_flow(1, m) << endl;

}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: