家园太空营救,又是死循环23333

本文深入探讨了一种复杂的网络流算法实现,通过详细的代码解析,展现了如何处理大规模网络中的流量分配问题,特别是在解决月球基地资源分配场景中,通过枚举和深度优先搜索等策略,实现了资源的有效调度。
#include<stdio.h>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f,M=100005;
int n,m,k,s,t,cnt=0,ans,maxx;
int fa[100],peo[100],g[100][100],num[100];//这里不开这么大第二个点会RE,不知道为什么
int next[M],to[M],head[M],flow[M],d[M],queu[M];


int findd(int xx)
{
    while(xx!=fa[xx])
        xx=fa[xx];
    return xx;

}

int dfs(int st,int ff)
{
    printf("st==%d,ff=%d\n",st,ff);
    if(st==t){
            printf("re%d\n",st);
    return ff;}
    int k1,sum=0;
    for(int i=head[st]; i; i=next[i])
    {
        printf("now i==%d,flow[%d]=%d,to[%d]=%d,d[%d]=%d,d[%d]=%d\n",i,i,flow[i],i,to[i],to[i],d[to[i]],st,d[st]);
        if(flow[i]>0&&d[to[i]]==d[st]+1)
        {
            k1=dfs(to[i],min(ff-sum,flow[i]));
            printf("qishi sum==%d,k1==%d,flow[%d]=%d,flow[%d]=%d,\n",sum,k1,i,flow[i],i^1,flow[i^1]);
            sum+=k1;
            flow[i]-=k1;
            flow[i^1]+=k1;
            printf("jieshu sum==%d,k1==%d,flow[%d]=%d,flow[%d]=%d,\n",sum,k1,i,flow[i],i^1,flow[i^1]);
            if(sum==ff)return sum;
        }
    }

    return sum;
}
int bfs()
{
    printf("once\n");
    for(int i=1; i<=ans*(n+1); i++)d[i]=0;
    int he=1,ta=1;
    d[t]=0;
    queu[1]=0;
    while(he<=ta)
    {
        int  x=queu[he++];
        printf("x=%d\n",x);
        if(x==t)return 1;
        for(int i=head[x]; i; i=next[i]){
                printf("i=%d,next[%d]=%d,flow[%d]=%d,to[%d]=%d,d[%d]=%d\n",i,i,next[i],i,flow[i],i,to[i],to[i],d[to[i]]);
            if(flow[i]>0&&!d[to[i]])
            {
                d[to[i]]=d[x]+1;
                queu[++ta]=to[i];
                printf("d[%d]=%d\n",to[i],d[to[i]]);
            }
        }
    }
    return 0;

}
void combine(int q,int w)
{
    int t1,t2;
    t1=findd(q);
    t2=findd(w);
    printf("t1=%d,t2=%d\n",t1,t2);
    if(t1!=t2)
        fa[t1]=t2;
}

void add(int u,int v,int f)
{
    to[cnt]=v;
    next[cnt]=head[u],flow[cnt]=f,head[u]=cnt++;
    to[cnt]=u;
    next[cnt]=head[v],flow[cnt]=0,head[u]=cnt++;
}

int main()
{
    int x,y;
    t=M-2;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1; i<=n+2; i++)fa[i]=i;
    for(int i=1; i<=m; i++)
    {
        scanf("%d%d",&peo[i],&num[i]);
        for(int j=0; j<num[i]; j++)
        {
            scanf("%d",&g[i][j]);
            if(g[i][j]==0)g[i][j]=n+1;
            if(g[i][j]==-1)g[i][j]=n+2;
            if(j)combine(g[i][j-1],g[i][j]);
        }
    }
    if(findd(n+1)!=findd(n+2))
    {
        printf("NO\n");
        return 0;
    }
    ans=0;
    while(++ans)//枚举
    {
        add(s,(ans-1)*(n+1)+n+1,inf);//看来是把月球算进去了
         for(int qq=0;qq<cnt;qq++)
                printf("to[%d]=%d,flow[%d]=%d\n",qq,to[qq],qq,flow[qq]);
        for(int i=1; i<=m; i++)
        {
            x=(ans-1)%num[i],y=ans%num[i];
            printf("now x=%d,y=%d\n",x,y);
            if(g[i][x]==n+2)
                x=M-2;
            else
                x=(ans-1)*(n+1)+g[i][x];
            if(g[i][y]==n+2)
                y=M-2;
            else
                y=(ans-1)*(n+1)+g[i][y];
                  printf("and x=%d,y=%d\n",x,y);
            add(x,y,peo[i]);
            for(int qq=0;qq<cnt;qq++)
                printf("to[%d]=%d,flow[%d]=%d\n",qq,to[qq],qq,flow[qq]);
        }
        while(bfs())
        {
            maxx=dfs(0,inf);
            printf("maxx=%d\n",maxx);
        }
        if(maxx>=k)
        {
            printf("%d\n",ans);
            return 0;
        }
        for(int i=1; i<=n+1; i++)
        {
            printf("ohh!\n");
            add((ans-1)*(n+1)+i,ans*(n+1)+i,inf);
             for(int qq=0;qq<cnt;qq++)
                printf("to[%d]=%d,flow[%d]=%d\n",qq,to[qq],qq,flow[qq]);
        }
    }
    return 0;

}

bfs出错,但基本思想已经了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值