网络流Dinic TLE 7个点,不知道怎么优化了,求大佬看看

P1231 教辅的组成

###### 30pts TLE+1 蒟蒻求解/kk 我的代码 ```cpp #include<queue> #include<cstdio> #include<cctype> #include<vector> #include<cstring> #include<algorithm> using std::min; using std::queue; using std::vector; template<class I> inline void read(I & x) { char c = ' '; x = 0; while (!isdigit(c)) c = getchar(); while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar(); } template<class I> inline void read(I & a, I & b) {read(a), read(b);} template<class I> inline void read(I & a, I & b, I & c) {read(a), read(b), read(c);} template<class I> inline void read(I & a, I & b, I & c, I & d) {read(a), read(b), read(c), read(d);} struct node { int to, v, inv; node() { to = v = inv = 0; } node(int t, int vv, int i) { to = t, v = vv, inv = i; } }; queue<int> q; int maxflow, dep[630000], curl[630000], s = 0, t; vector<node> e[630000]; inline bool bfs() { while (!q.empty()) q.pop(); memset(dep, 0, sizeof dep), dep[s] = 1, q.push(s); while (!q.empty()) { int now = q.front(); q.pop(); for (register int i = 0; i < e[now].size(); ++i) if (e[now][i].v && !dep[e[now][i].to]) dep[e[now][i].to] = dep[now] + 1, q.push(e[now][i].to); } return dep[t]; } int dfs(int now, int cost) { if (now == t) return cost; for (register int& i = curl[now]; i < e[now].size(); ++i) { if (dep[e[now][i].to] == dep[now] + 1 && e[now][i].v) { int x = dfs(e[now][i].to, min(cost, e[now][i].v)); if (x > 0) { e[now][i].v -= x, e[e[now][i].to][e[now][i].inv].v += x; return x; } } } return 0; } inline void Dinic() { while (bfs()) memset(curl, 0, sizeof curl), maxflow += dfs(s, 2147483647); } inline void addedge(int u, int v, int w) { e[u].push_back(node(v, w, e[v].size())), e[v].push_back(node(u, 0, e[u].size() - 1)); } int n1, n2, n3, m1, m2; int main(void) { read(n1, n2, n3, m1), t = (n1 << 1) + n2 + n3 + 1; for (register int i = 1; i <= n1; ++i) addedge(i + n2, i + n2 + n1, 1); for (register int i = 1; i <= n2; ++i) addedge(s, i, 1); for (register int i = 1; i <= n3; ++i) addedge(i + n2 + (n1 << 1), t, 1); for (register int i = 1, x, y; i <= m1; ++i) read(x, y), addedge(y, x + n2, i); read(m2); for (register int i = 1, x, y; i <= m2; ++i) read(x, y), addedge(x + n2 + n1, y + (n1 << 1) + n2, i); Dinic(), printf("%d\n", maxflow); return 0; } ```
by oneton429 @ 2020-06-11 21:52:22


TLE7个+1 超长代码 ```cpp #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; int head[100001],cnt,n,m,s,t,maxflow,dis[100001],ans,vis,cur[100001],pp,qq; queue<int>q; struct node { int to,dis,next; }a[1000001]; void add_edge(int from,int to,int dis) { a[++cnt].to=to; a[cnt].dis=dis; a[cnt].next=head[from]; head[from]=cnt; } bool bfs() { //cout<<"bfs"<<endl; for(int i=1;i<=n;i++) { cur[i]=head[i]; dis[i]=0; } while(!q.empty())q.pop(); q.push(s); dis[s]=1; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i;i=a[i].next) { int v=a[i].to; if(a[i].dis&&!dis[v]) { q.push(v); dis[v]=dis[u]+1; if(v==t)return 1; } } } return 0; } int luogu(int u,int flow_now)//返回u点使用了多少流量,flow_now为当前点可以使用的流量 { //cout<<"dfs"<<endl; if(u==t) { vis=1; return flow_now; } int k=0,used=0; for(int i=cur[u];i;i=a[i].next) { cur[u]=i; int v=a[i].to; if(a[i].dis&&dis[v]==dis[u]+1) { k=luogu(v,min(flow_now-used,a[i].dis)); if(!k)dis[v]=0; a[i].dis-=k; a[i^1].dis+=k; used+=k; } } return used; } int main() { int x,y; cin>>n>>pp>>qq; cnt++; cin>>m; for(int i=1;i<=n;i++) { add_edge(i,i+n,1); add_edge(i+n,i,0); } for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); add_edge(y+2*n,x,1); add_edge(x,y+2*n,0); } cin>>m; for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); add_edge(x+n,y+2*n+pp,1); add_edge(y+2*n+pp,x+n,0); } for(int i=1;i<=pp;i++) { add_edge(2*n+pp+qq+1,i+2*n,1); add_edge(i+2*n,2*n+pp+qq+1,0); } for(int i=1;i<=qq;i++) { add_edge(i+2*n+pp,2*n+pp+qq+2,1); add_edge(2*n+pp+qq+2,i+2*n+pp,0); } s=2*n+pp+qq+1; t=2*n+pp+qq+2; n=2*n+pp+qq+2; while(bfs()) { while(1) { vis=0; ans=luogu(s,0x7fffffff); if(!ans||!vis)break; maxflow+=ans; } } cout<<maxflow; } ``` 应该只有我一百多行吧
by lei_yu @ 2020-07-03 19:39:39


|