日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 5093 二分匹配

發布時間:2025/3/14 编程问答 9 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 5093 二分匹配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/* 題意:給你一些冰島。公共海域和浮冰,冰島可以隔開兩個公共海域,浮冰無影響 求選盡可能多的選一些公共海域點每行每列僅能選一個。 限制條件:冰山可以隔開這個限制條件。即*#*可以選兩個 預處理: ***** **#*# ***** 可以按行轉化 ***** **#oo ooo*# *****按行轉化的基礎上按列轉化 ***o**o **ooooo oooo*oo **o**o* 因為每行每列頂多可以增加50 所以總共最多2500*2500的矩陣 然后直接二分匹配即可 */ #include<stdio.h> #include<string.h> #define N 2800 int ma[N][N]; char s[60][60]; int ans[N][N]; int n,m,addx,addy; void slovex() {//按行轉化int i,k;addx=0; for(i=1;i<=n;i++) { addx++;//printf("%d\n",addx);k=1; while(1) {for(;s[i][k]!='#'&&k<=m;k++) {if(s[i][k]=='*')ans[addx][k]=1;}if(k==m)//最后一個也要算進去,剛開始這里錯了一直沒看出來重要*****ans[addx][k]=2;if(k==m+1||k==m)break;ans[addx][k]=2;k++;addx++; } } return ; } void slovey() {//在按行轉化的基礎上按列轉化int i,k;addy=0;for(i=1;i<=m;i++) {addy++;k=1;// printf("%d\n",addy);while(1) {for(;ans[k][i]!=2&&k<=addx;k++) {if(ans[k][i]==1)ma[k][addy]=1;}if(k==addx+1||k==addx)break;k++;addy++;}}return; } int vis[N],link[N]; int findd(int u) { int i; for(i=1;i<=addy;i++) if(ma[u][i]&&vis[i]==0) { vis[i]=1; if(link[i]==-1||findd(link[i])) { link[i]=u; return 1; } } return 0; } int main() {int t,i,sum,j;scanf("%d",&t);while(t--) {scanf("%d%d",&n,&m);memset(ma,0,sizeof(ma));memset(ans,0,sizeof(ans));for(i=1;i<=n;i++)scanf("%s",s[i]+1);slovex();/* for(i=1;i<=addx;i++) {for(j=1;j<=m;j++)printf("%d ",ans[i][j]);printf("\n");}*/slovey();/* for(i=1;i<=addx;i++) {for(j=1;j<=addy;j++)printf("%d ",ma[i][j]);printf("\n");}*/memset(link,-1,sizeof(link));sum=0;for(i=1;i<=addx;i++) {//直接套模板二分匹配即可memset(vis,0,sizeof(vis));sum+=findd(i);}printf("%d\n",sum);} return 0;}

轉載于:https://www.cnblogs.com/thefirstfeeling/p/4410563.html

總結

以上是生活随笔為你收集整理的hdu 5093 二分匹配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。