Why WA.Please help.Please give me some test case which fail my program.Thanks in advance.
Code: Select all
#include<stdio.h>
#include<string.h>
#define NN 109
int cap[NN][NN],deg[NN],adj[NN][NN],cap_save[NN][NN];
int q[NN],prev[NN],CC,CCC;
int dinic(int n,int s,int t)
{
int flow =0,u,v,z,i;
while(true)
{
memset(prev,-1,sizeof(prev));
int qf=0,qb=0;
prev[q[qb++]=s]=-2;
while(qb>qf&&prev[t]==-1)
for(u = q[qf++],i=0,v;i<deg[u];i++)
if(prev[v=adj[u][i]]==-1&&cap[u][v])
prev[q[qb++]=v]=u;
if(prev[t]==-1)
break;
for( z=0;z<n;z++)
if(cap[z][t]&&prev[z]!=-1)
{
int bot = cap[z][t];
for( v=z,u=prev[v];u>=0;v=u,u=prev[v])
if(bot>cap[u][v])
bot=cap[u][v];
if(!bot)
continue;
cap[z][t]-=bot;
cap[t][z]+=bot;
for( v=z,u=prev[v];u>=0;v=u,u=prev[v])
{
cap[u][v]-=bot;
cap[v][u]+=bot;
}
flow+=bot;
if(flow>=CC)
break;
}
if(flow>=CC)
break;
}
return flow;
}
int make(int n,int s,int t,int cap[109][109])
{
int flow =0,u,v,z,i;
while(true)
{
memset(prev,-1,sizeof(prev));
int qf=0,qb=0;
prev[q[qb++]=s]=-2;
while(qb>qf&&prev[t]==-1)
for(u = q[qf++],i=0,v;i<deg[u];i++)
if(prev[v=adj[u][i]]==-1&&cap[u][v])
prev[q[qb++]=v]=u;
if(prev[t]==-1)
break;
for( z=0;z<n;z++)
if(cap[z][t]&&prev[z]!=-1)
{
int bot = cap[z][t];
for( v=z,u=prev[v];u>=0;v=u,u=prev[v])
if(bot>cap[u][v])
bot=cap[u][v];
if(!bot)
continue;
cap[z][t]-=bot;
cap[t][z]+=bot;
for( v=z,u=prev[v];u>=0;v=u,u=prev[v])
{
cap[u][v]-=bot;
cap[v][u]+=bot;
}
flow+=bot;
if(flow>=CC-CCC)
break;
}
if(flow>=CC-CCC)
break;
}
return flow;
}
int main()
{
int n,s,t,m,u,v,c,test=0,flow,sa[109][109],i,j,k,in=0,flag;
while(1)
{
scanf("%d %d %d",&n,&m,&CC);
if(n==0&&m==0&&CC==0)
break;
memset(cap,0,sizeof(cap));
memset(sa,0,sizeof(sa));
s=0;
t=n-1;
while(m--)
{
scanf("%d %d %d",&u,&v,&c);
cap[u-1][v-1]+=c;
sa[u-1][v-1]=cap[u-1][v-1];
cap[v-1][u-1]+=c;
}
memset(deg,0,sizeof(deg));
for(u=0;u<n;u++)
for(v=0;v<n;v++)
if(cap[u][v])
adj[u][deg[u]++]=v;
test++;
flow=dinic(n,s,t);
in++;
printf("Case %d: ",in);
if(flow>=CC)
printf("possible\n");
else
{
CCC=flow;
flag=0;
memcpy(cap_save,cap,sizeof(cap));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(sa[i][j]!=0&&cap[i][j]==0)
{
cap[i][j]=CC;
k=make(n,s,t,cap);
if(flow+k>=CC)
{ if(flag==0)
{printf("possible option:(%d,%d)",i+1,j+1);
flag=1;}
else
printf(",(%d,%d)",i+1,j+1);
}
cap[i][j]=0;
memcpy(cap,cap_save,sizeof(cap));
}
if(flag==0)
printf("not possible");
printf("\n");
}
}
return 0;
}