蒟蒻11分求教

P2762 太空飞行计划问题

@[沐忆](/space/show?uid=62090) 把dfs改成 ``` int dfs(int u,int flow) { if(u==T) return flow; int temp=flow; for(int &i=cur[u];i;i=e[i].nxt) if(dep[e[i].v]==dep[u]+1&&e[i].w!=0){ int di=dfs(e[i].v,min(flow,e[i].w)); if(!di) dep[e[i].v]=0; e[i].w-=di; e[i^1].w+=di; temp-=di; } return flow-temp; } ``` 之后你的wrong output format Unexpected end of file - int32 expected 问题可以得到解决但仍然是11分, 可能是细节问题
by 水题自动机 @ 2018-12-10 14:34:07


@[沐忆](/space/show?uid=62090) 可能是printf太骚(大雾
by p_b_p_b @ 2018-12-10 14:50:17


@[沐忆](/space/show?uid=62090) 把整个程序改成 ``` #include<bits/stdc++.h> using namespace std; constexpr int Size=1e6+1; constexpr int Inf=numeric_limits<int>::max(); constexpr int S=0; struct edge{ int v,w,nxt; }e[Size]; int n,m,sum,cnt=1,T; int cur[Size],dep[Size],head[Size]; char tools[10000]; void deal(int num); int Dinic(); bool bfs(); int dfs(int u,int flow=Inf); void add_edge(int u,int v,int w,bool flag=true); int main() { scanf("%d%d",&n,&m); T=n+m+5; for(int i=1,val;i<=n;i++){ scanf("%d",&val); add_edge(S,i,val); sum+=val; deal(i); } for(int i=n+1,cost;i<=n+m;i++){ scanf("%d",&cost); add_edge(i,T,cost); } int ans=Dinic(); for(int i=1;i<=n;i++) if(dep[i]){ printf("%d ",i); } printf("\n"); for(int i=n+1;i<=n+m;i++) if(dep[i]) printf("%d ",i-n); printf("\n"); printf("%d",sum-ans); } int Dinic() { int ret=0; while(bfs()){ memcpy(cur,head,sizeof(head)); int d=dfs(S); while(d!=0){ ret+=d; d=dfs(S); } } return ret; } int dfs(int u,int flow) { if(u==T){ return flow; } int temp=flow; for(int &i=cur[u];i&&temp;i=e[i].nxt) if(dep[e[i].v]==dep[u]+1&&e[i].w){ int di=dfs(e[i].v,min(temp,e[i].w)); if(!di) dep[e[i].v]=0; e[i].w-=di; e[i^1].w+=di; temp-=di; } return flow-temp; } bool bfs() { queue<int> q; memset(dep,0,sizeof(dep)); dep[S]=1; q.push(S); while(!q.empty()){ int now=q.front(); q.pop(); for(int i=head[now];i;i=e[i].nxt) if(dep[e[i].v]==0&&e[i].w>0){ dep[e[i].v]=dep[now]+1; q.push(e[i].v); if(e[i].v==T)return 1; } } return 0; } void add_edge(int u,int v,int w,bool flag) { cnt++; e[cnt].v=v; e[cnt].w=w; e[cnt].nxt=head[u]; head[u]=cnt; if(flag) add_edge(v,u,0,false); } void deal(int num) { memset(tools,0,sizeof(tools)); cin.getline(tools,10000); int ulen=0,tool; while(sscanf(tools+ulen,"%d",&tool)==1){ add_edge(num,tool+n,Inf); if(tool==0) ulen++; else{ while(tool){ tool/=10; ulen++; } } } } ``` 就可以了
by 水题自动机 @ 2018-12-10 14:54:28


ps:你的wrong output format Unexpected end of file - int32 expected错误的确是printf导致的
by 水题自动机 @ 2018-12-10 14:57:21


@[水题自动机](/space/show?uid=37545) 感谢帮助
by 沐忆 @ 2018-12-11 13:07:54


|