#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出错,但基本思想已经了解。
本文深入探讨了一种复杂的网络流算法实现,通过详细的代码解析,展现了如何处理大规模网络中的流量分配问题,特别是在解决月球基地资源分配场景中,通过枚举和深度优先搜索等策略,实现了资源的有效调度。
2049

被折叠的 条评论
为什么被折叠?



