您的位置:首页 > 其它

nyoj489哭泣的天使

2012-11-13 18:30 393 查看
用的sap链表存的数据,为什么时间会跑了700多ms,而用邻接矩阵只用了600ms,别人的却用了80ms。
路过赐教。
#include<stdio.h>#include<string.h>#define maxn 200010#define inf 0x7fffffffstruct 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;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: