BZOJ2240 : ural1676 Mortal Combat
生活随笔
收集整理的這篇文章主要介紹了
BZOJ2240 : ural1676 Mortal Combat
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先如果最大匹配不足$n$個那么顯然每條邊都不可能在匹配為$n$的方案中。
對于一條邊$(u,v)$,如果它可能在最大匹配中,有兩種情況:
$1.(u,v)$是當前方案的匹配邊。
$2.$可以沿著$(u,v)$進行增廣,那么在殘余網絡中$u$在$v$在一個環中,即屬于同一個強連通分量。
因為源點不存在出邊,因此只需加入匯點再求SCC即可。
時間復雜度$O(n^3)$。
?
#include<cstdio> const int N=1505,M=N*N; int n,m,T,i,j,b[N],f[N],g[N<<1],v[M],nxt[M],G[N<<1],V[M],NXT[M],ed,vis[N<<1],q[N<<1],t,id[N<<1];char a[N][N]; bool find(int x){for(int i=1;i<=m;i++)if(!b[i]&&a[x][i]){b[i]=1;if(!f[i]||find(f[i]))return f[i]=x,1;}return 0; } inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;V[ed]=x;NXT[ed]=G[y];G[y]=ed; } void dfs1(int x){vis[x]=1;for(int i=g[x];i;i=nxt[i])if(!vis[v[i]])dfs1(v[i]);q[++t]=x; } void dfs2(int x,int y){vis[x]=0;id[x]=y;for(int i=G[x];i;i=NXT[i])if(vis[V[i]])dfs2(V[i],y); } int main(){scanf("%d%d",&n,&m);for(i=1;i<=n;i++)for(scanf("%s",a[i]+1),j=1;j<=m;j++)a[i][j]-='0';for(i=1;i<=n;i++){for(j=1;j<=m;j++)b[j]=0;if(!find(i)){for(i=1;i<=n;puts(""),i++)for(j=1;j<=m;j++)putchar('1');return 0;}}T=n+m+1;for(i=1;i<=n;i++)for(j=1;j<=m;j++)if(a[i][j])if(f[j]==i)add(j+n,i);else add(i,j+n);for(i=1;i<=m;i++)if(f[i])add(T,i+n);else add(i+n,T);for(i=1;i<=T;i++)if(!vis[i])dfs1(i);for(i=t;i;i--)if(vis[q[i]])dfs2(q[i],q[i]);for(i=1;i<=n;puts(""),i++)for(j=1;j<=m;j++)if(a[i][j]&&(f[j]==i||id[i]==id[j+n]))putchar('0');else putchar('1');return 0; }
總結
以上是生活随笔為你收集整理的BZOJ2240 : ural1676 Mortal Combat的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python解惑:整数比较
- 下一篇: 教育经验