用的sap链表存的数据,为什么时间会跑了700多ms,而用邻接矩阵只用了600ms,别人的却用了80ms。
路过赐教。
#include<stdio.h>
#include<string.h>
#define maxn 200010
#define inf 0x7fffffff
struct cc
{
int adj;
int nxet;
int w;
int re;//反向.
}edge[maxn];
int pre[maxn],start,top;
int high[maxn],head[maxn],dis[maxn];
void init(int u,int v,int w)
{
edge[++top].adj=v;
edge[top].w=w;
edge[top].nxet=head[u];
head[u]=top;
edge[top].re=top+1;
edge[++top].adj=u;
edge[top].w=0;
edge[top].nxet=head[v];
head[v]=top;
edge[top].re=top-1;
}
int MIN(int x,int y)
{
return x>y?y:x;
}
int sap(int m)
{
memset(high,0,sizeof(high));
memset(dis,0,sizeof(dis));
high[0]=m;
int u=start,flow=inf,ans=0;
while(dis[start]<m)
{
while(1)
{
bool flag=false;
for(int j=head[u];j!=-1;j=edge[j].nxet)
{
int i=edge[j].adj;
if(edge[j].w>0&&dis[u]==dis[i]+1)
{
flow=MIN(flow,edge[j].w);
pre[i]=j;
u=i;
if(i==m) // 等于汇点。
{
ans+=flow;
while(i!=start)
{
u=pre[i];
edge[u].w-=flow;
edge[edge[u].re].w+=flow;
i=edge[edge[u].re].adj;
}
u=start;
flow=inf;
}
flag=true;
break;
}
}
if(!flag) break;
}
int Min=m;
for(int j=head[u];j!=-1;j=edge[j].nxet) //找由该点出发的标号最小值。
if(edge[j].w>0&&dis[edge[j].adj]<Min)
Min=dis[edge[j].adj];
--high[dis[u]];
if(high[dis[u]]==0) break;
dis[u]=Min+1;
high[dis[u]]++;
if(u!=start) u=edge[edge[pre[u]].re].adj;
}
return ans;
}
int main()
{
//freopen("Input.txt","r",stdin);
int n,m,ncase,a;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%d%d",&n,&m);
top=-1;
int sum1=0,sum2=0;
memset(head,-1,sizeof(head));
for(int i=2;i<=n+1;i++)
{
scanf("%d",&a);
init(1,i,a);
sum1+=a;
}
for(int i=1;i<=m;i++)
{
scanf("%d",&a);
init(n+1+i,n+m+2,a);
sum2+=a;
for(int j=2;j<=n+1;j++)
init(j,n+1+i,1);
}
//printf("case %d:\n",yy++);
if(sum1!=sum2) {printf("Terrible\n");continue;}
start=1;
int tt=sap(n+m+2);
if(tt!=sum1) printf("Terrible\n");
else printf("Not Sure\n");
}
return 0;
}