HDU 1045 fire net【二分匹配或者DFS】
阿新 • • 發佈:2019-02-16
#include<stdio.h> #include<string.h> char map[5][5]; int mapr[5][5],mapl[5][5]; int g[20][20];/*儲存邊的資訊*/ int link[20],use[20]; int uN,vN; int ans; int dfs(int u)/*找增廣路*/ { int v; for(v=1;v<=vN;v++) if(g[u][v]==1&&use[v]==0) { use[v]=1; if(link[v]==-1||dfs(link[v])) { link[v]=u; return 1; } } return 0; } int hungry()/*匈牙利演算法*/ { int res; int u; res=0; memset(link,-1,sizeof(link));/*初始化為-1*/ for(u=1;u<=uN;u++) { memset(use,0,sizeof(use)); if(dfs(u))res++; } return res; } int main() { int n; int i,j; while(scanf("%d",&n)!=-1&&n) { getchar(); memset(mapr,0,sizeof(mapr)); memset(mapl,0,sizeof(mapl)); memset(g,0,sizeof(g)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='X') mapr[i][j]=mapl[i][j]=-1; } getchar(); } uN=0;/*對行的連續區域進行標記*/ for(i=1;i<=n;i++) for(j=1;j<=n;j++) { while(mapr[i][j]==-1&&j<=n) j++; uN++; while(mapr[i][j]!=-1&&j<=n) { mapr[i][j]=uN; j++; } } vN=0;/*對列的連續區域進行標記*/ for(j=1;j<=n;j++) for(i=1;i<=n;i++) { while(mapl[i][j]==-1&&i<=n) i++; vN++; while(mapl[i][j]!=-1&&i<=n) { mapl[i][j]=vN; i++; } } for(i=1;i<=n;i++)/*建圖*/ for(j=1;j<=n;j++) { if(mapr[i][j]!=-1&&mapl[i][j]!=-1) g[mapr[i][j]][mapl[i][j]]=1; } ans=hungry(); printf("%d\n",ans); } return 0; }