@[沐忆](/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