Dinic算法求二分图最大匹配TLE

学术版

@[moye到碗里来](/space/show?uid=52576) 那是一般图的dinic复杂度...dinic跑二分图的复杂度能证明是n*sqrt(m)的emmm
by strangers @ 2018-07-12 11:18:09


@[strangers](/space/show?uid=52452) 我去看了一下,有一篇博客写的的确是那样..
by moye到碗里来 @ 2018-07-12 11:18:34


@[strangers](/space/show?uid=52452) @moye到碗里来那这么说我不用写匈牙利了呗(鸡冻)
by SkyLiYu @ 2018-07-12 11:19:44


@[moye到碗里来](/space/show?uid=52576) $dicnic$一般复杂度$O(VE^{2})$但是跑二分图复杂度会急减到$O(n\sqrt{m})$
by 小可爱三岁七 @ 2018-07-12 11:19:49


@[隔壁小邱](/space/show?uid=22539) 有的时候有基于匈牙利算法的贪心...例如NOI2009 变换序列...还是要了解一下的(大雾
by strangers @ 2018-07-12 11:21:29


@[小可爱三岁七](/space/show?uid=62490) @[moye到碗里来](/space/show?uid=52576) @[strangers](/space/show?uid=52452) 敢问诸位大佬我的Dinic是不是哪里写错了(好吧一定是这样QWQ)
by SkyLiYu @ 2018-07-12 11:22:17


@[strangers](/space/show?uid=52452) 可是我是联赛小渣渣,不考国赛啊(滑稽)
by SkyLiYu @ 2018-07-12 11:23:04


@[隔壁小邱](/space/show?uid=22539) 你把我的拿过去试一下呢...说不定是你常数写的太大了... ``` #include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f struct node { int from,to,cap,flow; }; vector<node>edges; vector<int>load[10005]; int n,m,s,t; int cur[10005]; int d[10005]; void add(int u,int v,int w) { edges.push_back((node){u,v,w,0}); edges.push_back((node){v,u,0,0}); int x=edges.size(); load[u].push_back(x-2); load[v].push_back(x-1); } bool bfs() { memset(d,0,sizeof(d)); queue<int>q; q.push(s); d[s]=1; while(!q.empty()) { int u=q.front();q.pop(); int x=load[u].size(); for(register unsigned int i=0;i<x;i++) { node &v=edges[load[u][i]]; if(!d[v.to]&&v.cap>v.flow) { d[v.to]=d[u]+1; q.push(v.to); } } } return d[t]!=0?1:0; } int dfs(int u,int mini) { if(mini==0||u==t) return mini; int x=load[u].size(); int flow=0; for(register int &i=cur[u];i<x;i++) { node& v=edges[load[u][i]]; int f; if(d[v.to]==d[u]+1&&(f=dfs(v.to,min(mini,v.cap-v.flow)))>0) { v.flow+=f; edges[load[u][i]^1].flow-=f; flow+=f; mini-=f; if(mini==0)break; } } return flow; } void dinic() { int ans=0; while(bfs()) { memset(cur,0,sizeof(cur)); ans+=dfs(s,INF); } printf("%d",ans); } int main() { scanf("%d %d %d %d",&n,&m,&s,&t); for(register unsigned int i=1;i<=m;i++) { int u,v,w; scanf("%d %d %d",&u,&v,&w); add(u,v,w); } dinic(); } ```
by moye到碗里来 @ 2018-07-12 11:23:14


@[moye到碗里来](/space/show?uid=52576) 老师有代码匹配,风格不一样,被他发现就……(你懂得)
by SkyLiYu @ 2018-07-12 11:25:12


@[moye到碗里来](/space/show?uid=52576) 还有,为啥您每次都说我大常数问题,这个大常数到底是个什么意思QWQ
by SkyLiYu @ 2018-07-12 11:26:04


上一页 | 下一页