【问题标题】:UVA(820):Internet Bandwidth getting wrong answer?UVA(820):互联网带宽得到错误答案?
【发布时间】:2015-12-10 16:35:24
【问题描述】:

我正在尝试在 UVA 上解决这个Problem。问题是关于在图中找到最大流量。我使用了 Edmond-karp 算法,但我不断得到错误的答案。谁能告诉我有什么问题我的代码? 我的代码:

#include<bits/stdc++.h>
using namespace std;
#define MX 1000000007
#define LL long long
#define ri(x) scanf("%d",&x)
#define rl(x) scanf("%lld",&x)
#define len(x) x.length()
#define FOR(i,a,n) for(int i=a;i<n;i++)
#define FORE(i,a,n) for(int i=a;i<=n;i++)
template<class T1> inline T1 maxi(T1 a,T1 b){return a>b?a:b;}
template<class T2> inline T2 mini(T2 a,T2 b){return a<b?a:b;}
int parent[101],G[101][101],rG[101][101];
bool bfs(int s,int t,int n)
{   
    bool vis[n+2];
    memset(parent,0,sizeof parent);
    memset(vis,0,sizeof vis);
    queue<int>Q;
    Q.push(s);
    vis[s]=true;
    while(!Q.empty())
    {
        int fnt=Q.front();
        Q.pop();
        for(int v=1;v<=n;v++)
        {
            if(!vis[v] and G[fnt][v]>0)
            {
                vis[v]=true;
                parent[v]=fnt;
                Q.push(v);
            }
        }
    }
    return vis[t];
}
int main()
{
    int n,tst=1;
    ri(n);
    while(n)
    {
        int s,t,c,flow=0;
        ri(s),ri(t),ri(c);
        FORE(i,1,c)
        {
            int x,y,z;
            ri(x),ri(y),ri(z);
            G[x][y]+=z;
            G[y][x]+=z;
        }
        while(bfs(s,t,n))
        {
            int path=9999999;
            for(int v=t;v!=s;v=parent[v])
            {
                int u=parent[v];
                path=mini(path,G[u][v]);
            }
            for(int v=t;v!=s;v=parent[v])
            {
                int u=parent[v];
                G[u][v]-=path;
                G[v][u]+=path;
            }
            flow+=path;
        }       
        printf("Network %d\nThe bandwidth is %d.\n\n", tst++, flow);
        ri(n);
    }
}

【问题讨论】:

  • 我讨厌关于 UVA 的问题陈述,因为它们通常没有给出足够清晰的约束。在这个问题中,您绝对确定最大流量不会溢出吗?您可以在一对节点之间有多个边,因此理论上最大流量可能会溢出。
  • 这不是调试服务。缩小问题范围并提出更具体的问题。至少给我们一个失败的案例。

标签: algorithm graph flow


【解决方案1】:

你反过来推动流量:

G[u][v]-=path;
G[v][u]+=path;

这应该是:

G[u][v] += path;
G[v][u] -= path;

另外,我不确定这部分:

if(!vis[v] and G[fnt][v]>0)

[...]

path=mini(path,G[u][v]);

因为您也可以选择流量为负的路径。您不应该更改G,这似乎是您的容量图。相反,您应该有一个矩阵 F 来存储您发送的流量。那么你的两个条件应该改为:

if (!vis[v] && G[fnt][v] != F[fnt][v])

[...]

path = mini(path, G[u][v] - F[u][v])

然后在F 上推送流量,而不是G

自从你声明了一个矩阵rG 之后,你似乎已经考虑过这一点,但你从未使用过它。

可能还有其他问题。不知道您遇到了什么问题,很难说清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    相关资源
    最近更新 更多