萌新求助网络流
  • 板块学术版
  • 楼主phigy
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/3/19 14:53
  • 上次更新2023/11/5 01:53:52
查看原帖
萌新求助网络流
115359
phigy楼主2021/3/19 14:53

这是一号代码:

#include <iostream>
#include <cstring>

using namespace std;

const int N = 10010, E = 200010;

int n,m;
int head[N];
int to[E],nxt[E],val[E];
int cnt=1;

bool vis[N];

void add(int u, int v, int w)
{
    cnt++;
    to[cnt] = v;
    val[cnt] = w;
    nxt[cnt] = head[u];
    head[u] = cnt;
}
int FF(int u,int flow)
{
    if (u==t)
    {
        return flow;
    }
    vis[u]=1;
    for(int p=head[u];p;p=nxt[p])
    {
        int v=to[p];
        if (val[p]==0||vis[v])
        {
            continue;
        }
        int res = 0;
        if( (res = EK ( v, min (flow, val[p]) ) ) > 0)
        {
            val[p] -= res;
            val[p ^ 1] += res;
            return res;
        }
    }
    return 0;
}
int main()
{
    int i,j,k;
    cin>>n>>m;
    s=1;
    t=n;
    for(i=1;i<=m;i++)
    {
        int u, v, w;
        cin>>u>>v>>w;
        add(u,v,w);
        add(v,u,0);
    }
    int res = 0, tot = 0;
    while (memset(vis, 0, sizeof(vis)) and (res = FF, 2e9)) > 0)
    {
        tot += res;
    }
    cout<<tot;
    return 0;
}

这是2号代码:

#include <iostream>
#include <cstring>
using namespace std;

int n,m,s,t;

struct edge
{
    int to,next,dis;
}e[100005];
int cnt=1,head[100005];

void add(int x,int y,int z)
{
    cnt++;
    e[cnt].to=y;
    e[cnt].dis=z;
    e[cnt].next=head[x];
    head[x]=cnt;
}

int vis[100005];

int FF(int x,int flow)
{
    if(x==t)return flow;
    vis[x]=1;
    for(int i=head[x];i;i=e[i].next)
    {
        int v=e[i].to;
        if(e[i].dis==0||vis[v])continue;
        int res=0;
        if(res=FF(v,min(flow,e[i].dis))>0)
        {
            e[i].dis-=res;
            e[i^1].dis+=res;
            return res;
        }
    }
    return 0;
}
int main()
{
    int i,j,k;
    cin>>n>>m;
    s=1;
    t=n;
    for(i=1;i<=m;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        add(x,y,z);
        add(y,x,0);
    }
    int ans=0,res=0;
    while(res=FF(s,10000)>0)
    {
        memset(vis,0,sizeof(vis));
        ans+=res;
    }
    cout<<ans;
    return 0;
}

这是3号代码

#include <iostream>
#include <cstring>
#include <queue>

using namespace std;

int n,m,s,t;

struct edge
{
    int to,next,dis;
}e[100005];
int cnt=1,head[100005];

void add(int x,int y,int z)
{
    cnt++;
    e[cnt].to=y;
    e[cnt].dis=z;
    e[cnt].next=head[x];
    head[x]=cnt;
    return ;
}

int vis[100005];
int d[100005];

int bfs()
{
    queue<int> q;
    q.push(s);
    d[s]=1;
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        for(int i=head[x];i;i=e[i].next)
        {
            int v=e[i].to;
            if(e[i].dis&&!d[v])
            {
                d[v]=d[x]+1;
                if(v==t)return 1;
                q.push(v);
            }
        }
    }
    return 0;
}

int EK(int x,int flow)
{
    if(x==t)return flow;
    for(int i=head[x];i;i=e[i].next)
    {
        int v=e[i].to;
        if(e[i].dis==0||d[v]!=d[x]+1)continue;
        int res=0;
        if(res=EK(v,min(flow,e[i].dis))>0)
        {
            e[i].dis-=res;
            e[i^1].dis+=res;
            return res;
        }
    }
    return 0;
}
int main()
{
    int i,j,k;
    cin>>n>>m;
    s=1;
    t=n;
    for(i=1;i<=m;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        add(x,y,z);
        add(y,x,0);
    }
    int ans=0,res=0;
    while(bfs())
    {
        ans+=EK(s,2e11);
        memset(vis,0,sizeof(vis));
        memset(d,0,sizeof(d));
    }
    cout<<ans;
    return 0;
}

萌新有几个问题:

  1. 1,2号代码是FF算法吗?
  2. 在大数据下1号比2号代码快10秒是没使用结构体的原因吗?
  3. 3号代码是EK算法吗?如果是那为什么在大数据下比1号慢20秒?
2021/3/19 14:53
加载中...