poj1273

这是一道网络流模板题,我却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, -1sizeof(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] < 0return flow;
        memset(iter, 0sizeof(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;
    }
}


你可能感兴趣的:(图论,ACM题解报告)