Dinic算法tle求救

P3386 【模板】二分图最大匹配

#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cctype> #include<cmath> #include<cstdlib> #include<queue> #include<ctime> #include<vector> #include<set> #include<map> #include<stack> using namespace std; const int inf=1e9+7; struct edge{ int c,to,next; }e[2000000]; int head[5000],level[5000],cnt; void add(int u,int v,int w){ e[cnt].c=w; e[cnt].to=v; e[cnt].next=head[u]; head[u]=cnt++; } int bfs(int s,int t){ queue<int>q; memset(level,-1,sizeof(level)); q.push(s); level[s]=0; while(!q.empty()){ int u,v; u=q.front(); q.pop(); for(int i=head[u];~i;i=e[i].next){ v=e[i].to; if(level[v]==-1&&e[i].c){ level[v]=level[u]+1; q.push(v); } } } if(level[t]==-1)return 0; return 1; } int dfs(int u,int v,int flow){ if(u==v)return flow; int res=0; for(int i=head[u];~i;i=e[i].next){ int j=e[i].to; if(level[j]==level[u]+1&&e[i].c){ int f=dfs(j,v,min(e[i].c,flow-res)); res+=f; e[i].c-=f; e[i^1].c+=f; } } if(!res)level[u]=-1; return res; } int main() { int n,m,E,i,j,k,u,v,ans=0; scanf("%d%d%d",&n,&m,&E); memset(head,-1,sizeof(head)); for(i=1;i<=E;i++){ scanf("%d%d",&u,&v); if(v>m)continue; add(u,v+n,1); add(v+n,u,0); } for(i=1;i<=n;i++){ add(n+m+1,i,1); add(i,n+m+1,0); } for(i=1;i<=m;i++){ add(n+i,n+m+2,1); add(n+m+2,n+i,0); } int s=n+m+1,t=n+m+2; while(bfs(s,t)) while(int a=dfs(s,t,inf)) ans+=a; printf("%d\n",ans); return 0; }
by SKY_magician @ 2018-02-06 14:22:18


这头像很6(逃)
by Edgration @ 2018-02-06 14:26:13


@[Edgration](/space/show?uid=42857) 呵呵
by SKY_magician @ 2018-02-06 14:32:38


数组再开大一点点试试?
by 142857cs @ 2018-02-27 09:43:40


|