标签:des style class blog code java
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 12800 | Accepted: 4000 |
Description
Input
Output
Sample Input
4 3 2 2 1 3 3
Sample Output
YES
Hint
Source
和 hdu 1507类似,构无向图然后判断匹配数是否等于合法的格数。
心算32*32错了= = RE了两次,开始以为32*32是90+,第二次以为是900+,笔算后才知道是1024..
1 //224K 125MS C++ 1731B 2014-06-10 12:44:41 2 #include<iostream> 3 #include<vector> 4 #define N 1050 5 using namespace std; 6 vector<int>V[N]; 7 int match[N]; 8 int vis[N]; 9 int g[35][35]; 10 int dfs(int u) 11 { 12 for(int i=0;i<V[u].size();i++){ 13 int v=V[u][i]; 14 if(!vis[v]){ 15 vis[v]=1; 16 if(match[v]==-1 || dfs(match[v])){ 17 match[v]=u; 18 return 1; 19 } 20 } 21 } 22 return 0; 23 } 24 int hungary(int n) 25 { 26 int ret=0; 27 memset(match,-1,sizeof(match)); 28 for(int i=1;i<=n;i++){ 29 memset(vis,0,sizeof(vis)); 30 ret+=dfs(i); 31 } 32 return ret; 33 } 34 int main(void) 35 { 36 int n,m,k,x,y; 37 while(scanf("%d%d%d",&n,&m,&k)!=EOF) 38 { 39 memset(g,0,sizeof(g)); 40 for(int i=0;i<N;i++) V[i].clear(); 41 for(int i=0;i<k;i++){ 42 scanf("%d%d",&y,&x); 43 g[x-1][y]=1; 44 } 45 int map[N]={0},pos=0; 46 for(int i=0;i<n;i++) 47 for(int j=1;j<=m;j++) 48 if(!g[i][j]){ 49 if(!map[i*m+j]) map[i*m+j]=++pos; 50 int u=map[i*m+j]; 51 if(j<m && !g[i][j+1]){ 52 if(!map[i*m+j+1]) map[i*m+j+1]=++pos; 53 V[u].push_back(map[i*m+j+1]); 54 V[map[i*m+j+1]].push_back(u); 55 } 56 if(i<n-1 && !g[i+1][j]){ 57 if(!map[(i+1)*m+j]) map[(i+1)*m+j]=++pos; 58 V[u].push_back(map[(i+1)*m+j]); 59 V[map[(i+1)*m+j]].push_back(u); 60 } 61 } 62 //printf("%d\n",pos); 63 if(hungary(pos)==pos) puts("YES"); 64 else puts("NO"); 65 } 66 return 0; 67 }
poj 2446 Chessboard (二分匹配),布布扣,bubuko.com
标签:des style class blog code java
原文地址:http://www.cnblogs.com/GO-NO-1/p/3779765.html